【发布时间】:2015-03-08 18:06:38
【问题描述】:
我有一个 512 x 512 x 112 矩阵,具有三种值:零、非零和 NaN。
如何有效地获取矩阵的非零值的索引(不使用循环)?
【问题讨论】:
-
实际上
[idx1 idx2 idx3] = ind2sub(size(my_mat), find(my_mat));应该可以完成这项工作,但我怀疑因为您的矩阵的大小很大
我有一个 512 x 512 x 112 矩阵,具有三种值:零、非零和 NaN。
如何有效地获取矩阵的非零值的索引(不使用循环)?
【问题讨论】:
[idx1 idx2 idx3] = ind2sub(size(my_mat), find(my_mat)); 应该可以完成这项工作,但我怀疑因为您的矩阵的大小很大
@scmg 的评论是可行的方法——Matlab 的线性逻辑索引是一种避免循环遍历元素的方法;在我的电脑上只需要 1.2 秒。这是一个工作示例:
rng(8675309) %jenny number for consistency
x=randn([512,512,112]); % make random matrix
x(x<0)=NaN; % set some elements to NaN
x(x<4)=0; % set some elements to zero
[i1,i2,i3]=ind2sub(size(x),find(x>0)); %use find+ind2sub to avoid loop
scatter3(i1,i2,i3)% plot results for fun
【讨论】:
x(x>1) = NaN; 和x(x>4) = 0; 尝试了你的代码,我的Matlab 忙了30 多秒,直到我按下Ctrl + C(+_+!)--- 或者只是使用x(1,1,1) = 0; x(512, 512, 512) = NaN;,我的Matlab 很忙大约 20 秒后自行退出(用完 8GB-RAM?)!!!
x(1,1,1) = 0; x(512, 512, 512) = NaN;,那么我的笔记本电脑上的速度非常慢,即使是那个 Matlab忙了 20 秒后自行退出,我不确定它是否发生在你身上......我认为问题在于你的代码,我得到了大约 10000 个索引的结果
find 函数似乎对我来说很快就完成了。
scatter3,绘制 10M 与 1k 点太多了。此外,命令 x(512,512,512) 将尝试让 matlab 向 x: size(x) =[512,512,112] 添加 >100k 更多条目,这也会导致一些滞后。