作者cashpaggy (布丁女孩)
看板MATLAB
标题[问题] 统计阵列元素个数
时间Wed Dec 14 21:09:01 2011
我有a,b两个大小相同矩阵
想统计a矩阵中元素出现的次数
但是不是出现一次加一次
是依照b矩阵中相对应位置的元素当作出现次数
ex.
a=[1 2 1 b=[3 2 1
2 1 1 5 1 1
1 1 1] 2 2 2]
1:3+1+1+1+2+2+2=12次
2:2+5=7次
a的元素是正浮点数 但实际多少要依输入资料而定
b的元素是0~1之间浮点数
想请问这要怎麽做?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.64.91.30
1F:推 Raymond0710:1:sum(sum((a==1).*b)) 2:sum(sum((a==2).*b)) 12/14 21:53
2F:→ Raymond0710:1:sum(sum(b(a==1))) 2:sum(sum(b(a==2))) 12/14 21:55
3F:→ Raymond0710:两种方法 12/14 21:55
喔喔!!
可是那是举例
现实的a我没办法用==这种方式写
因为a元素是浮点数
值的范围很大 个数也很多 768*1024个
也可能完全没重复
所以b也是这麽多个0.00001~1.00000的浮点数
这样的话有比较好的写法吗?
4F:推 diva:把==改成>和<如何? 12/15 01:49
如果我是要写多少数量在区间内的话应该是可以这样写
把0~1分五个区间 0~0.2 0.2~0.4...分开统计
如果说要精确统计的话呢?
5F:推 Raymond0710:那可能你要设定一个精度 abs(a-1) < tol 接近1的范围 12/15 02:03
这个我不知道什麽意思耶...
可以再说明一下吗? 感谢
6F:推 Raymond0710:针对你的问题 1.00001 0.99999 都视为1的话 12/15 16:27
7F:推 Raymond0710:所以abs(a-1)<0.0001 会是true 12/15 16:30
8F:→ Raymond0710:0.0001是你的精度 12/15 16:31
我有一个想法不知道可不可行
就是我将a当作index去sort b
用一个新的阵列装 c=[a b
a b
a b
....]
然後判断a是否相同再累加b
这样是可行的吗?
不过我还是不太清楚这要怎麽写就是了XD
9F:→ Raymond0710:那用我在1 2楼PO的方法还比较省事 12/16 18:59
10F:→ Raymond0710:所以你现在还有什麽问题? 12/16 18:59
我用我後来这个方法写完了
只是我还是不了解你的方法 囧
我是这样写 麻烦请你帮我看看有没有问题
L_1d=L(:);
NG_1d=Nor_Gau(:);
[sort_L, id]=sort(L_1d);
num=prod(size(sort_L));
tmpS=[];
tmpS(1,1)=sort_L(1);
tmpS(1,2)=0;
tmp=sort_L(1);
j=1;
for i=2:num
if sort_L(i)==tmp
tmpS(j,2)=tmpS(j,2)+NG_1d(id(i));
elseif sort_L(i)~=tmp
j=j+1;
tmpS(j,1)=sort_L(i);
tmpS(j,2)=NG_1d(id(i));
tmp=sort_L(i);
end
end
11F:→ Raymond0710:看来没什麽问题 不过你说过L可能是浮点数不能用==判断 12/16 20:40
12F:→ Raymond0710:所以我才说了可以改成 abs(sort_L(i)-tmp)<0.0001 12/16 20:41
13F:→ Raymond0710:0.0001 改越小代表精度越高 12/16 20:44
我大概明白你的意思了
总觉得我的方法不够直觉...
程式码可能也还有简化的空间吧
写了好大一串
不知道哪里还可以优化
感谢你的指导!!
※ 编辑: cashpaggy 来自: 203.64.91.30 (12/17 00:45)
14F:推 Raymond0710:要优化加速就是1 2楼的方法了 12/17 01:42
15F:→ Raymond0710:若你资料量很大 for回圈会很慢很慢 12/17 01:43