我有这段代码
A = unidrnd(2,100,30)-1;
B = reshape(A, 100, 3, 10);
B是具有10层100x3矩阵的多维数组。现在我想执行此代码,
C = length(nonzeros(all(B,2)))/100;
其中代码右侧的函数假设生成10个对应于10个层的结果的值,但我得到的只是单个值。代码的右手检查有多少行都是1。它将行数全部为1并将其除以100,以获得全部为1的行数的分数。
如何使用上面显示的单行代码获得3D矩阵的每个100 x 3
层的结果,这样我就不必使用循环了?结果 C 必须是预期的结果数组。
答案 0 :(得分:2)
你开始很好。 all(B,2)
很好,它会为100x1x10
矩阵提供1
矩阵,其中相应的行都是1和0
。
nonzeros
只列出整个矩阵的所有非零元素,在您的情况下,为1的字符串,完全忽略数组的维度。使用nonzeros(A(:))
获得与nonzeros(A)
相同的结果
[注意:nnz(A)
可以获得与length(nonzeros(A))
相同的结果,但这不是我们想要做的事情。]
由于矩阵是二进制的(all
的输出是逻辑数组),我们可以通过对矩阵元素求和来计算非零元素的数量。并且sum
为我们提供了一个维度参数,就像all
一样,所以我们只是总结all
给我们的列。
C = sum(all(B,2),1)/100;
这会为您提供1x1x10
百分比数组。如果您希望它只是一个普通的向量,您可以使用squeeze
。
C = squeeze(sum(all(B,2),1)/100);