Performance 在N维阵列(51251240)上优化MATLAB工作

Performance 在N维阵列(51251240)上优化MATLAB工作,performance,matlab,for-loop,optimization,matrix,Performance,Matlab,For Loop,Optimization,Matrix,我正在处理512x512像素的图像;我已经编写了一个代码,可以分析我的图像,并在10分钟左右的时间内,使用预分配,在具有维度(51251240)的矩阵中为我提供所需的值 我的问题是,当我想处理这个矩阵时:我需要几个小时才能看到结果,我想实现一些脚本,用更少的时间完成我想要的事情。你能帮我吗 % meanm is a matrix (512,512,400) that contains the mean of every inputmatrix % sigmam is a matrix (512,

我正在处理512x512像素的图像;我已经编写了一个代码,可以分析我的图像,并在10分钟左右的时间内,使用预分配,在具有维度(51251240)的矩阵中为我提供所需的值

我的问题是,当我想处理这个矩阵时:我需要几个小时才能看到结果,我想实现一些脚本,用更少的时间完成我想要的事情。你能帮我吗

% meanm is a matrix (512,512,400) that contains the mean of every inputmatrix
% sigmam is a matrix (512,512,400) that contains the std of every inputmatrix 

% Basically what I want is that for every inputmatrix (512x512), that is stored inside
% an array of dimensions (512,512,400),
% if a value is higher than the meanm + sigmam it has to be changed with 
% the corrispondent value of meanm matrix.

p=400;
for h=1:p
    if (inputmatrix(:,:,h) > meanm(:,:,h) + sigmam(:,:,h))
       inputmatrix(:,:,h) = meanm(:,:,h);
    end
end

我知道MatLab在矩阵计算方面表现得更好,但我不知道如何将我的400幅图像上的for循环转换为更简单的形式。

尝试使用for循环的条件生成逻辑矩阵

logical_mask = (meanm + sigmam) < inputmatrix;
inputmatrix(logical_mask) = meanm(logical_mask);
logical_mask=(meanm+sigmam)
这将通过使用Matlab的两个功能来提高性能

  • 使用矩阵运算而不是循环。引用链接站点的话,“矢量化代码通常比包含循环的相应代码运行得快得多。”
  • 允许您同时访问阵列中满足条件的所有元素
    “每个输入矩阵的平均值”
    听起来不是很清楚。如果
    meanm
    是所有400张
    inputmatrix
    图像的平均值,那么它的大小不应该是
    512 x 512
    而不是
    51 x 512 x 400
    ?我还对
    inputmatrix
    的大小感到困惑。如果是(512x512),那么如何在for循环中执行
    inputmatrix(:,:,h)
    ?我猜这里的某个地方有一个输入错误。矩阵的meanm数组在每个输入矩阵的平均值矩阵内,因为我执行一个特定的平均值:在每个输入矩阵上,我计算一个点与其最近邻居的平均值。这是我分析的一部分,它给了我正确的结果。问题在于这个结果。@2cents I在我所有的inputmatrix上循环,这就是为什么for循环400不确定这是否可行,但是试试这个-
    inputmatrix(inputmatrix>meanm+sigmam)=meanm。它给了我这个错误<代码>???对复杂整数使用==>gt比较操作时出错已过时。请比较实(X)和实(Y)。22逻辑掩码=meanm+sigmam>矩阵处==>fun\u devenu中的错误可能问题是,Matlab不知道如何使用逻辑运算符处理N维数组…我不知道Matlab可以使用逻辑运算符和N维数组。它应用运算符元素。您的错误告诉您至少有一个数组包含复数。我觉得这很奇怪,因为图像的平均值和标准值不应该很复杂,但是如果你认为你的值是正确的,你可以做两件事中的一件。(1) 使用
    real
    比较复数的实部。(2)使用
    abs
    比较复数的大小。我认为这不应该是问题所在,但也可以尝试添加括号
    logical_mask=(meanm+sigmam)我确信我的值是正确的,因为如果我一次只分析一个矩阵,一切都能正常工作。无论如何,谢谢你,我从你写的东西中学到了很多。我已经决定改变对这项任务的看法,我将以不同的方式进行工作。再次感谢你@25美分