作者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/cn.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