MATLAB 数据索引问题。这里发生了什么?

MATLAB data indexing issue. What is going on here?

I 为恒等式,D 为正交投影,p 为向量。

我意识到我的几行代码合并为 (I-(I-D))(p),我可以将其简化为 D(p)。在替换它时,我计算了新方法和旧方法,以仔细检查我是否在计算相同的东西(在我的代码的早期,我有一行是 D = I - D。你在这里看到的 DD.) 我没有得到相同的答案,并将其追溯到索引 D.

中的错误

在这里你可以看到我正在使用调试器并检查 D 的部分并返回错误的数据。

右侧数据资源管理器中的值是我期望的值。有时我从 D(:,:,k,1) 得到了我期望的结果,有时我没有,即使我一个接一个地进行查询也是如此。

那些红色箭头指向的向量应该是相同的。在这些行之间没有任何其他更改或计算,并且当第一行是 运行 时 k = 2。我关闭了 MATLAB 并重新启动它,每次都遇到同样的问题。 (D 取决于随机输入,但我没有改变种子,所以我在新打开 MATLAB 后第一次 运行 得到相同的东西。D 的计算方式,我 do 期望 D(:,:,1,1) 是单位矩阵。)

这世界到底是怎么回事?感谢任何帮助。

我想知道 MATLAB 是不是故意在搞我。有时当我打开它时,会弹出一个对话框说我需要更新我的学生许可证。我点击了更新按钮,但什么也没有发生,对话框也没有关闭,所以我点击了取消。

编辑:

K>> whos D P
  Name      Size             Bytes  Class     Attributes

  D         4-D               4608  double              
  P         4x1x6              192  double              

K>> size(D)
ans =
     4     4     6     6

我一直在研究 AB,我得到了同样的结果。有时它会正确计算,有时却不会。

K>> B=permute(P,[1,3,2])
B =
       0.4155      0.27554      0.52338       0.6991     -0.11346      0.20999
      0.53573     -0.83781      0.53182    -0.022364      0.60291     -0.62601
     -0.49246     -0.46111     -0.39168      0.45919      0.42377      0.47074
      0.54574     0.097595      0.53835     -0.54763      0.66637      0.58516


K>> A=D
A(:,:,1,1) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1
A(:,:,2,1) =
      0.99071    -0.091198    0.0020814    -0.029755
    -0.091198      0.10503     0.020426       -0.292
    0.0020814     0.020426      0.99953    0.0066643
    -0.029755       -0.292    0.0066643      0.90473
A(:,:,3,1) =
      0.46769     0.019281     -0.49725     0.036486
     0.019281       0.9993     0.018011   -0.0013215
     -0.49725     0.018011      0.53551     0.034083
     0.036486   -0.0013215     0.034083       0.9975
A(:,:,4,1) =
      0.96774     0.063488     -0.10826      0.12438
     0.063488      0.87506      0.21304     -0.24477
     -0.10826      0.21304      0.63673      0.41737
      0.12438     -0.24477      0.41737      0.52047
A(:,:,5,1) =
       0.7542     0.031217      0.42575     0.056052
     0.031217      0.99604    -0.054071   -0.0071187
      0.42575    -0.054071      0.26255    -0.097088
     0.056052   -0.0071187    -0.097088      0.98722
A(:,:,6,1) =
       0.9818     -0.10286     0.085279    0.0034902
     -0.10286      0.41855      0.48208      0.01973
     0.085279      0.48208      0.60031    -0.016358
    0.0034902      0.01973    -0.016358      0.99933
A(:,:,1,2) =
      0.99071    -0.091198    0.0020814    -0.029755
    -0.091198      0.10503     0.020426       -0.292
    0.0020814     0.020426      0.99953    0.0066643
    -0.029755       -0.292    0.0066643      0.90473
A(:,:,2,2) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1
A(:,:,3,2) =
      0.97125     -0.15889   -0.0080537    -0.051131
     -0.15889      0.12194    -0.044507     -0.28256
   -0.0080537    -0.044507      0.99774    -0.014323
    -0.051131     -0.28256    -0.014323      0.90907
A(:,:,4,2) =
      0.91488     -0.16388     -0.18495      0.12967
     -0.16388       0.6845     -0.35607      0.24964
     -0.18495     -0.35607      0.59815      0.28174
      0.12967      0.24964      0.28174      0.80247
A(:,:,5,2) =
      0.95461      0.16812      0.10326     0.066372
      0.16812      0.37733     -0.38244     -0.24582
      0.10326     -0.38244      0.76511     -0.15098
     0.066372     -0.24582     -0.15098      0.90295
A(:,:,6,2) =
      0.99628     0.012018     0.052874     0.027665
     0.012018      0.96117     -0.17085    -0.089393
     0.052874     -0.17085      0.24833     -0.39329
     0.027665    -0.089393     -0.39329      0.79422
A(:,:,1,3) =
      0.46769     0.019281     -0.49725     0.036486
     0.019281       0.9993     0.018011   -0.0013215
     -0.49725     0.018011      0.53551     0.034083
     0.036486   -0.0013215     0.034083       0.9975
A(:,:,2,3) =
      0.97125     -0.15889   -0.0080537    -0.051131
     -0.15889      0.12194    -0.044507     -0.28256
   -0.0080537    -0.044507      0.99774    -0.014323
    -0.051131     -0.28256    -0.014323      0.90907
A(:,:,3,3) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1
A(:,:,4,3) =
      0.98622     0.043449    -0.066709     0.085142
     0.043449      0.86297      0.21038     -0.26852
    -0.066709      0.21038      0.67698      0.41227
     0.085142     -0.26852      0.41227      0.47382
A(:,:,5,3) =
      0.62859     0.041458      0.47558     0.074661
     0.041458      0.99537    -0.053085   -0.0083339
      0.47558    -0.053085      0.39105      -0.0956
     0.074661   -0.0083339      -0.0956      0.98499
A(:,:,6,3) =
      0.95505     -0.16608      0.12371    0.0067153
     -0.16608      0.38639      0.45705      0.02481
      0.12371      0.45705      0.65956     -0.01848
    0.0067153      0.02481     -0.01848        0.999
A(:,:,1,4) =
      0.96774     0.063488     -0.10826      0.12438
     0.063488      0.87506      0.21304     -0.24477
     -0.10826      0.21304      0.63673      0.41737
      0.12438     -0.24477      0.41737      0.52047
A(:,:,2,4) =
      0.91488     -0.16388     -0.18495      0.12967
     -0.16388       0.6845     -0.35607      0.24964
     -0.18495     -0.35607      0.59815      0.28174
      0.12967      0.24964      0.28174      0.80247
A(:,:,3,4) =
      0.98622     0.043449    -0.066709     0.085142
     0.043449      0.86297      0.21038     -0.26852
    -0.066709      0.21038      0.67698      0.41227
     0.085142     -0.26852      0.41227      0.47382
A(:,:,4,4) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1
A(:,:,5,4) =
      0.73864      0.20112    -0.011394      0.39048
      0.20112      0.84524    0.0087678     -0.30047
    -0.011394    0.0087678       0.9995     0.017023
      0.39048     -0.30047     0.017023      0.41662
A(:,:,6,4) =
      0.87322     -0.15647    0.0029936      0.29363
     -0.15647      0.80689    0.0036946      0.36238
    0.0029936    0.0036946      0.99993   -0.0069332
      0.29363      0.36238   -0.0069332      0.31996
A(:,:,1,5) =
       0.7542     0.031217      0.42575     0.056052
     0.031217      0.99604    -0.054071   -0.0071187
      0.42575    -0.054071      0.26255    -0.097088
     0.056052   -0.0071187    -0.097088      0.98722
A(:,:,2,5) =
      0.95461      0.16812      0.10326     0.066372
      0.16812      0.37733     -0.38244     -0.24582
      0.10326     -0.38244      0.76511     -0.15098
     0.066372     -0.24582     -0.15098      0.90295
A(:,:,3,5) =
      0.62859     0.041458      0.47558     0.074661
     0.041458      0.99537    -0.053085   -0.0083339
      0.47558    -0.053085      0.39105      -0.0956
     0.074661   -0.0083339      -0.0956      0.98499
A(:,:,4,5) =
      0.73864      0.20112    -0.011394      0.39048
      0.20112      0.84524    0.0087678     -0.30047
    -0.011394    0.0087678       0.9995     0.017023
      0.39048     -0.30047     0.017023      0.41662
A(:,:,5,5) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1
A(:,:,6,5) =
      0.93556      0.24481   -0.0093576     0.016177
      0.24481     0.069855     0.035553    -0.061461
   -0.0093576     0.035553      0.99864    0.0023492
     0.016177    -0.061461    0.0023492      0.99594
A(:,:,1,6) =
       0.9818     -0.10286     0.085279    0.0034902
     -0.10286      0.41855      0.48208      0.01973
     0.085279      0.48208      0.60031    -0.016358
    0.0034902      0.01973    -0.016358      0.99933
A(:,:,2,6) =
      0.99628     0.012018     0.052874     0.027665
     0.012018      0.96117     -0.17085    -0.089393
     0.052874     -0.17085      0.24833     -0.39329
     0.027665    -0.089393     -0.39329      0.79422
A(:,:,3,6) =
      0.95505     -0.16608      0.12371    0.0067153
     -0.16608      0.38639      0.45705      0.02481
      0.12371      0.45705      0.65956     -0.01848
    0.0067153      0.02481     -0.01848        0.999
A(:,:,4,6) =
      0.87322     -0.15647    0.0029936      0.29363
     -0.15647      0.80689    0.0036946      0.36238
    0.0029936    0.0036946      0.99993   -0.0069332
      0.29363      0.36238   -0.0069332      0.31996
A(:,:,5,6) =
      0.93556      0.24481   -0.0093576     0.016177
      0.24481     0.069855     0.035553    -0.061461
   -0.0093576     0.035553      0.99864    0.0023492
     0.016177    -0.061461    0.0023492      0.99594
A(:,:,6,6) =
     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1

编辑 2: 添加了相关代码。我一直在暂停代码,最后在 for 循环中得到错误。 (我相信它也在 S 中给出错误,但我一直专注于 D 试图弄清楚。)

mtimesx 来自 here.

n = 4;
M = 6;

P = Normalize(2*rand(n,1,M)-1);

%differences between p_i and p_j
%sum of p_i and p_j
d = Normalize(repmat(permute(P,[1,3,2]),[1,1,M]) - repmat(P,[1,M,1]));
s = Normalize(repmat(permute(P,[1,3,2]),[1,1,M]) + repmat(P,[1,M,1]));

d(isnan(d)) = 0;

%orthogonal projection onto d(:,i,j), i.e. outer product of differences
%orthogonal projection onto s(:,i,j), i.e. outer product of sums
D = mtimesx(permute(d,[1,4,2,3]), permute(d,[4,1,2,3]));
S = mtimesx(permute(s,[1,4,2,3]), permute(s,[4,1,2,3]));
D2 = D;
S2 = S;

%projection onto the complement of d(:,i,j)
%projection onto the complement of s(:,i,j)
D = repmat(eye(n),[1,1,M,M]) - D;
S = repmat(eye(n),[1,1,M,M]) - S;

%total distance to the nearest subspace
PDist = zeros([1,M]);
PDist2 = PDist;
for j = 1:M
    for k = 1:M-1
        for l = k:M
            if j~=k && j~=l
                PDist(j) = PDist(j) + min(norm(P(:,1,j) - mtimes(D(:,:,k,l),P(:,1,j))), norm(P(:,1,j) - mtimes(S(:,:,k,l),P(:,1,j))));
                PDist2(j) = PDist2(j) + min(norm(D2(:,:,k,1)*P(:,1,j)),norm(S2(:,:,k,1)*P(:,1,j)));
            end
        end
    end
end
PDist-PDist2

Normalize.m

%Normalize
%Accepts an array (of column vectors) and normalizes the columns

function B = Normalize(A)
    B = A./repmat(sqrt(sum(A.*A)),size(A,1),1);
end

问题是您在第一个示例和计算 PDist2 的代码中都使用常量 1 而不是变量 l(小写 L)对矩阵进行了索引。

一般来说,最好避免使用看起来彼此相似and/or类似于数字的变量名。

这可以通过使用高亮显示变量和常量使用不同颜色的编辑器来避免(我不知道这在 MATLAB 中是否可行)。实际上,这就是我在您的代码中发现错误的方式。如您所见,当为计算 PDist2 索引 D2 时,数字 1 显示为红色。