【发布时间】:2014-05-30 20:45:46
【问题描述】:
我在问自己寻找矩阵的第一个非零列的值的最“矢量化”解决方案是什么样的。如果存在矢量化解决方案但非常丑陋/骇人听闻,我也要求最优雅的解决方案。
假设我们有一个矩阵M,我们可以假设它至少包含一个非零值:
M =
0 0 1 0 0
0 0 2 0 0
0 0 3 0 42
0 0 4 0 0
0 0 0 0 0
我想在第一列中找到不全为零的值;所以对于这个例子,期望的输出是:
column =
1
2
3
4
0
我的第一次尝试使用了 for 循环并且工作正常,但它可能没有充分利用 matlab 中提供的工具。
>> for i = 1:size(M,2)
col = M(:,i);
if find(col) % empty array evaluates to false
break;
end
end
>> col
col =
1
2
3
4
0
我想出的另一个解决方案是使用嵌套的 find 和 cellfun 调用,但这可能仍然不是解决问题的最佳方法。
>> C = find(cellfun(@isempty, cellfun(@find, num2cell(M,1), 'UniformOutput', 0)) == 0)
C =
3 5
>> M(:,C(1))
ans =
1
2
3
4
0
【问题讨论】:
-
@Divakar 解决方案如此简单,真是令人尴尬。为什么不让您的评论成为答案?
标签: matlab find vectorization