0

有人可以解释以下代码片段吗?我没有计算机科学或编程方面的背景,最近才开始了解 Matlab。我理解从data=ceil(rand(7,5)*10)...to的预分配部分...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
4

2 回答 2

5

从零开始

kk=0; 

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

for ii=1:N-1 

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

b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));

%这与上面的行做同样的事情,但不是将循环的结果矩阵存储在单元格数组的单独单元格中,而是将新矩阵附加到原始数组中。请注意,新矩阵每次将具有相同数量的行但少一列,因此这将作为新列追加。%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));

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

kk=kk+N-ii;
end;

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

于 2012-08-02T08:26:33.923 回答
2
bsxfun(@minus,A,B)

几乎一样

A-B

不同之处在于该bsxfun版本将处理不同大小的输入:在每个维度(“方向”,如果您觉得这样更容易考虑的话),如果一个输入是标量,另一个是向量,则标量一个将简单地重复足够频繁。

http://www.mathworks.com/help/techdoc/ref/bsxfun.html

于 2012-08-02T07:34:01.207 回答