避免Matlab矩阵运算中的循环

避免Matlab矩阵运算中的循环,matlab,vectorization,Matlab,Vectorization,我有一个大的四维矩阵,我希望1)找到其中两个维度的最小值(即4000x4000结果),然后2)计算最后两个维度中小于(比方说)最小值5倍的元素数(即给出4000x4000结果)。我有点困惑于如何在不返回for循环的情况下执行此操作 一些代码可能有助于我的描述: A = rand([4000,4000,7,7]); B(:,:) = min(A(:,:,1:7;1:7)); % this isn't quite right? C = size( A < 5*B ) % o

我有一个大的四维矩阵,我希望1)找到其中两个维度的最小值(即4000x4000结果),然后2)计算最后两个维度中小于(比方说)最小值5倍的元素数(即给出4000x4000结果)。我有点困惑于如何在不返回for循环的情况下执行此操作

一些代码可能有助于我的描述:

A      = rand([4000,4000,7,7]);
B(:,:) = min(A(:,:,1:7;1:7)); % this isn't quite right?
C      = size( A < 5*B ) % obviously totally wrong
A=rand([40004000,7,7]);
B(:,:)=min(A(:,:,1:7;1:7));%这不太正确?
C=尺寸(A<5*B)%明显完全错误

任何指点都很好-非常感谢

如果我正确理解了这一点,以下几点应该可以完成这项工作:

mn = min(min(A,[],3),[],4);
num = sum(sum(bsxfun(@lt, A, 5*mn),3),4)

首先,它应该是
rand([40004000,7,7])

其次,要使用min,您必须执行类似于
min(A,[],1)
(将1替换为维度)


< p>第三,假设您有<代码> <代码> >代码> b>代码>,您希望<代码> c=和(和(a<5×b)< < /代码>

。如果您将其写入循环,它将使我们更好地了解您试图用什么来考虑使用<代码> PRCITE < /代码>,而不是最小值的固定倍数。只是想一想。我想阿姆罗的答案正是我想要的,只是稍微修改了一下,将1和2改为3和4,即num=sum(sum(bsxfun(@lt,a,5*mn),3),4)@yoda,我认为你的回答不太正确:a和mn有不同的维度,所以A@trican:如果此解决方案对您有效,您可以将is标记为已接受的答案:-)。从你的问题上看,你是想得到7x7还是4000x4000的结果还不是很清楚,也许你可以为这篇文章的未来读者澄清一下;-)@trican:当尝试矢量化一段代码时,总是从简单的解决方案(本例中为FOR循环)开始,然后逐步开始优化它。这样你就得到了一个比较正确性和性能的基准…@Jonas:啊,我明白了。我读过OP的一句话“找到其中两个维度的最小值”,意思是他想要最小的维度,在这种情况下,它是一个标量。