【问题标题】:Efficiently finding non zero numbers from a large matrix从大矩阵中有效地找到非零数
【发布时间】:2015-03-08 18:06:38
【问题描述】:

我有一个 512 x 512 x 112 矩阵,具有三种值:零、非零和 NaN。

如何有效地获取矩阵的非零值的索引(不使用循环)?

【问题讨论】:

  • 实际上[idx1 idx2 idx3] = ind2sub(size(my_mat), find(my_mat)); 应该可以完成这项工作,但我怀疑因为您的矩阵的大小很大

标签: matlab matrix


【解决方案1】:

@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&gt;1) = NaN;x(x&gt;4) = 0; 尝试了你的代码,我的Matlab 忙了30 多秒,直到我按下Ctrl + C(+_+!)--- 或者只是使用x(1,1,1) = 0; x(512, 512, 512) = NaN;,我的Matlab 很忙大约 20 秒后自行退出(用完 8GB-RAM?)!!!
  • @scmg 我不太明白你的意思。这对我来说似乎运行得足够快(只需一两秒钟)。这种方法应该慢是有原因的吗?
  • 我的意思是你发布的代码,它在我的 Matlab 中也运行良好,但如果我将第 3 行和第 4 行更改为x(1,1,1) = 0; x(512, 512, 512) = NaN;,那么我的笔记本电脑上的速度非常慢,即使是那个 Matlab忙了 20 秒后自行退出,我不确定它是否发生在你身上......我认为问题在于你的代码,我得到了大约 10000 个索引的结果
  • @scmg 奇数。我不确定会有什么不同。我同意这个数组非常大,但 find 函数似乎对我来说很快就完成了。
  • @scmg:真的很奇怪; x矩阵应该只有235Mb,你的系统配置是什么?我在 Win7 上使用 Matlab 2013b 64 位。更改矩阵以使大多数条目非零会增加计算时间(在我的情况下为 1.4 秒),但不要尝试将数据发送到 scatter3,绘制 10M 与 1k 点太多了。此外,命令 x(512,512,512) 将尝试让 matlab 向 x: size(x) =[512,512,112] 添加 >100k 更多条目,这也会导致一些滞后。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多