访问多维数组的图层并在每个图层上执行某些功能

时间:2016-01-23 19:59:20

标签: matlab multidimensional-array

我有这段代码

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 必须是预期的结果数组。

1 个答案:

答案 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);