Matlab 三维阵列中非零元素的平均值

Matlab 三维阵列中非零元素的平均值,matlab,vectorization,mean,Matlab,Vectorization,Mean,我有一个ixjxk3d矩阵(这是一部电影)。在没有循环的情况下,我尝试获取每个ixj数组中非零正元素的平均值,并将这些值放入1xK矩阵中 我已经搜索了很长一段时间了,虽然有很多解决方案可以实现2d矩阵的这一点,但我一辈子都找不到一种不使用循环就可以实现3d矩阵的方法。如果将每个图像(帧)转换为数组会怎么样: % Remove negative and zero elements A(A<=0) = 0; % Convert each image into array B = reshape

我有一个ixjxk3d矩阵(这是一部电影)。在没有循环的情况下,我尝试获取每个ixj数组中非零正元素的平均值,并将这些值放入1xK矩阵中


我已经搜索了很长一段时间了,虽然有很多解决方案可以实现2d矩阵的这一点,但我一辈子都找不到一种不使用循环就可以实现3d矩阵的方法。

如果将每个图像(帧)转换为数组会怎么样:

% Remove negative and zero elements
A(A<=0) = 0;
% Convert each image into array
B = reshape(A,[Nimg,Nfrm]);
% Extract mean value of each image
C = mean(B,1);

如果将每个图像(帧)转换为数组,会发生什么情况:

% Remove negative and zero elements
A(A<=0) = 0;
% Convert each image into array
B = reshape(A,[Nimg,Nfrm]);
% Extract mean value of each image
C = mean(B,1);

如果不需要循环,那么将每个帧的总和除以非零元素的数量如何:

sum(sum(A))./sum(sum(A ~= 0))

要去除负数,首先运行塔舒卡指出的
A(A<0)=0
,如果不需要循环,那么将每个帧的总和除以非零元素的数量如何:

sum(sum(A))./sum(sum(A ~= 0))


要去除负数,首先运行
A(A<0)=0
,正如塔舒卡所指出的那样

,所以使用循环。等待无循环代码的时间比使用无循环代码节省的时间要多。然后继续进行更具挑战性的工作,只有在必要时才回来优化这部分代码。有一句古老的格言,没有循环的Matlab代码比使用代码的等效循环性能更好,这是一句古老的格言。大约从2010b开始,很多基于循环的代码已经和等价的矢量化代码一样快了。谢谢你的建议,但我已经在使用循环,现在正在尝试优化。不过我同意你的看法。如果你已经有了一个循环,请发布它的代码以便使用循环。等待无循环代码的时间比使用无循环代码节省的时间要多。然后继续进行更具挑战性的工作,只有在必要时才回来优化这部分代码。有一句古老的格言,没有循环的Matlab代码比使用代码的等效循环性能更好,这是一句古老的格言。大约从2010b开始,很多基于循环的代码已经和等价的矢量化代码一样快了。谢谢你的建议,但我已经在使用循环,现在正在尝试优化。不过我同意你的看法。如果你已经有了一个循环,请发布代码,说明如何将所有0元素设置为0删除0元素?@Dan我对上一个代码的工作假设是,他想计算每个帧的平均强度。因此,元素的数量必须是恒定的。例如,只有一个像素强度为256的16x16图像,我的方法的平均值为1,而你的方法的平均值为256。用户未指定此详细信息。用户指定了“非零正元素的平均值”。所以你不能用零来计算平均值。在这个假设下,每一帧都是不同的。哈哈,谢谢。我认为这个非常简单的问题已经占用了我们足够的时间。如何将所有0元素设置为0删除0元素?@Dan我对前面代码的工作假设是,他想计算每帧的平均强度。因此,元素的数量必须是恒定的。例如,只有一个像素强度为256的16x16图像,我的方法的平均值为1,而你的方法的平均值为256。用户未指定此详细信息。用户指定了“非零正元素的平均值”。所以你不能用零来计算平均值。在这个假设下,每一帧都是不同的。哈哈,谢谢。我认为这个非常简单的问题已经占用了我们足够的时间。您的代码似乎在命名符中包含了所有的数字,在分母中只有非零。@EitanT,但负数可能会影响。我们假设图像的编码不包含负数,但用户从未这样说过。@tashuhka我接受你关于负数的观点。在这种情况下,我同意应该首先调用
A(A<0)=0
。您的代码似乎包含了命名符中的所有数字,分母中只有非零。@EitanT,但负数可能会影响。我们假设图像的编码不包含负数,但用户从未这样说过。@tashuhka我接受你关于负数的观点。在这种情况下,我同意首先调用
A(A<0)=0