matlab:了解matlab的行为

Bun*_*lan 0 matlab bsxfun

有人可以解释下面的代码片段吗?我没有计算机科学或编程的背景,最近才意识到Matlab.我理解的预分配部分来自data=ceil(rand(7,5)*10)......N*(N-1)/2).

我需要了解matlab如何处理代码kk=0到最后的各个方面.此外,代码以这种方式编纂的原因.没有必要解释以下函数:bsxfun(@minus),它是如何在代码方案中运行的.

data=ceil(rand(7,5)*10); 
N = size(data,2);
b=cell(N-1,1);
c=NaN(size(data,1),N*(N-1)/2); 

kk=0;
for ii=1:N-1
    b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
    kk=kk+N-ii;
end
Run Code Online (Sandbox Code Playgroud)

Dan*_*Dan 5

从零开始

kk=0; 
Run Code Online (Sandbox Code Playgroud)

循环使用ii从1到N-1每次迭代递增1.输入1:10matlab的命令行,你会看到它输出1 2 3 4 5 6 7 8 9 10.Thuis冒号操作符是matlab中非常重要的操作符.

for ii=1:N-1 
Run Code Online (Sandbox Code Playgroud)

b {ii} = ...这只是将矩阵存储在单元格向量b的下一个元素中.单元格数组可以在其每个元素中保存任何内容,这是必要的,因为在这种情况下,每次迭代创建的矩阵比前一次迭代少一列.data(:,ii) - >只需获取矩阵数据的第i列(:表示获取所有行)数据(:,ii + 1:end)表示获取由所有行组成的矩阵数据的子集只有在列ii bsxfun(@minus,data(:,ii),data(:,ii + 1:end)) - >之后出现的列对于矩阵数据中的每一列(:,ii + 1:end) ,减去单列数据(:,ii)

b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
Run Code Online (Sandbox Code Playgroud)

%这与上面的行完全相同,但不是将循环的结果矩阵存储在单元格数组的单独单元格中,而是使用新矩阵附加原始数组.请注意,新矩阵每次都会有相同的行数,但会减少一列,因此会追加为新列.%c(:,kk +(1:N-ii))= .... - >所以1:(N-ii)产生数字1直到该迭代结果中的列数.在matlab中,您可以使用另一个数组索引数组.例如,在matlab的命令行中尝试这个:a = [0 0 0 0 0]; a([1 3 5]) = 1.你应该看到的结果是a = 1 0 1 0 1.但你也可以像这样扩展矩阵,例如现在输入a(6) = 2.结果:a = 1 0 1 0 1 2.因此,通过使用c(:,1:N-ii),我们索引c的所有行以及正确的列数(按顺序).添加kk只是抵消它,因此我们不会覆盖以前的结果.

c(:,kk+(1:N-ii)) = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
Run Code Online (Sandbox Code Playgroud)

现在我们只将kk增加我们添加的新列的数量,以便在下一次迭代中,在末尾附加c.

kk=kk+N-ii;
end;
Run Code Online (Sandbox Code Playgroud)

我建议你在这段代码中加一个断点,逐行逐步查看,看看变量在matlab中是如何变化的.要执行此操作,请单击k=0;mfile 旁边的小虚线,您将看到出现一个红点,然后运行代码.代码只会执行到点,您现在处于调试模式.如果将鼠标悬停在调试模式下的变量上,matlab将在工具提示中显示其内容.对于一个非常大的变量,请在工作区中查看它.现在逐行逐步执行代码并使用上面的解释来确保您了解每行如何更改每个变量.对于更复杂的行,b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));你应该突出显示代码片段并在命令行中破坏它们以查看每个部分正在做什么,例如运行data(:,ii)以查看它的作用然后尝试data(:,ii+1:end))甚至只是ii+1:end(在这种情况下它不会工作,替换结束大小(数据,2)).调试是理解让您感到困惑的代码的最佳方式.