【问题标题】:MATLAB: avoid loop when using a function within a matrixMATLAB:在矩阵中使用函数时避免循环
【发布时间】:2015-11-19 10:35:13
【问题描述】:

我有一个矩阵 A:“M x N”。我想在矩阵中运行一个函数,

例如,回归:让每一列是 Y,其余列是 Xs

    for i=1:N
        Y = A(:,i);   % let Y be the "i"th columns
        X = A; X(:,i)=[];     % let X be other columns
        coef(:,i)=regress(Y,X);
    end

我想知道是否有任何matlab函数能够处理循环中的函数

【问题讨论】:

  • 查看了regress,看起来它对于矢量化来说已经足够复杂了,所以如果你问我,可能不值得。但是在列出的代码级别进行优化时,您可以在进入循环之前预先计算 X 并迭代使用它。
  • 如果您的数据中没有很多/任何NaN,您可以使用coeff(:,i)=X\Y。可能比regress 更快。使用qr 解决系统甚至可能比反斜杠更快。 @Divakar 你怎么看?这会带来更多的矢量化魔法吗?
  • @David 好好研究regress,它似乎很少有范数计算,可以应用矢量化,但那里的性能瓶颈似乎是tinv,我猜这是反斜杠你在说什么。不确定是否可以在那里使用qr,因为我不太了解它或与它们相关的性能数据。
  • 如果qr可以使用,this solution可能值得一看。
  • 我想要一些可以在每个循环中得到两个矩阵(“一列”和“其他列”)的想法。我觉得可能有比 for 循环更好的解决方案。您是否有任何想法,例如,将它们转移到 X 和 Y 单元阵列中?其中每个 X 单元是一个 X 矩阵(矩阵 A 减去一列),每个 Y 单元是一个 Y 向量

标签: algorithm matlab loops


【解决方案1】:

这应该快得多!

[n_rows, n_cols] = size(A);
ind = true(1,n_cols);
coef2 = zeros(n_cols - 1, n_cols);

for i=1:n_cols
    y = A(:,i);   % let Y be the "i"th columns
    ind(i) = false;
    X = A(:,ind);     % let X be other columns
    coef2(:,i)= X\y;
    ind(i) = true;
end

我的代码和你的代码之间的差异:

  1. X \ y 为您提供 y 在 X 上的回归系数。(最重要的)
  2. 我不调整矩阵大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多