作者profyang (prof)
看板MATLABE
標題Re: [心得] 資料型態 轉存方法
時間Mon Mar 30 00:09:29 2015
※ 引述《Lionel (跟快樂交往)》之銘言:
: 大家好 大家晚安
: 假設我有以下資料
: 0 0 0 0 0 0 0 0
: 0 0 0 0 0 0 0 1
: 1 0 0 0 0 0 0 0
: 以上為 (i,j)值僅有{0,1}
: 3*8的double型態
: 想要的到
: 00000000
: 00000001
: 10000000
: 欲得
: 把(i,1)到(i,8)抓起來在一起
: 3*1的uint8
: 3*1的char
: 我知道uint8()跟char()的function
: 可是 轉出來依舊還是3*8矩陣
: 感謝大家
如原文底下推文你的3*1 char是不可能的 因為你字的長度就是>1
底下是接近的code:
A=[0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1;
1 0 0 0 0 0 0 0];
C=zeros(size(A,1),1);
for n=1:size(A,1)
B(n,:)=dec2bin(A(n,:)).';
C(n,:)=uint8(bin2dec(B(n,:)));
end
B會是3*8的char
(如果你直接用char轉出來不會是你原來01這些字元 是他ASCII code對應字元)
C就是3*1的矩陣[0;1;128]
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.247.141
※ 文章網址: https://webptt.com/m.aspx?n=bbs/MATLAB/M.1427645375.A.F9A.html
1F:→ profyang: 暫時想不到不用for的作法= =" 03/30 00:10
2F:→ celestialgod: 我沒用for,可是用的很複雜,看上面推文XD 03/30 00:12
3F:→ celestialgod: 沒用過dec2bin,我試試看把我的code改用這個functio 03/30 00:14
4F:→ profyang: 用for跟用cellfun不知道誰比較慢 代我試試 03/30 00:19
我的code改成以下:
A=[0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1;
1 0 0 0 0 0 0 0];
A=repmat(A,100000,1);
tic;
B=cell(size(A,1),1); %主要是多這行 for loop有先宣告大小速度差很多
C=zeros(size(A,1),1);
for n=1:size(A,1)
B{n}=dec2bin(A(n,:)).';
C(n,:)=uint8(bin2dec(B{n}));
end
toc;
吐出來結果似乎是跟c大的一樣(當然我為了測速度把A變大100000倍)
實測下來好像for loop跟cellfun一樣慢XDDD
5F:推 Lionel: 還有這招XD 03/30 00:22
6F:→ Lionel: dec2bin(A(n,:)).' 後面的.'是轉置嗎 可是我實際上跑 03/30 00:28
7F:→ Lionel: 好像沒差 03/30 00:28
8F:→ profyang: 因為我試dec2bin(A(n,:))跑出來會是8*1的東西我覺得怪怪 03/30 00:30
※ 編輯: profyang (140.112.247.141), 03/30/2015 00:33:27
9F:→ profyang: c大的code我也用新的(用dec2bin) 結果我電腦都大概20s 03/30 00:35
10F:→ celestialgod: 我試的結果也是 03/30 00:46
11F:→ celestialgod: 第二行可以改成auint8 = uint8(bin2dec(achar)); 03/30 00:53
12F:→ celestialgod: 會快很多 03/30 00:53
13F:→ celestialgod: 推錯篇...不過就是C(n,:)的迴圈不要跑,改成上面 03/30 00:54
找到不用for的了:
B=reshape(dec2bin(A),size(A,1),[]);
C=bin2dec(B);
※ 編輯: profyang (140.112.247.141), 03/30/2015 00:57:01
14F:→ profyang: 根本神速= = 03/30 00:57
15F:→ celestialgod: 果然樓上厲害!! 03/30 01:02
16F:推 Lionel: 超神手 03/30 13:35