有人可以解释以下代码段吗?我没有计算机科学或编程的背景,最近才意识到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
答案 0 :(得分: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的下一个元素中存储矩阵。单元格数组可以在其每个元素中保存任何内容,这是必要的,因为在这种情况下,每次迭代创建的矩阵比前一次迭代少一列。 数据(:,ii) - >只需获取矩阵数据的第i列(:表示获取所有行) data(:,ii + 1:end)表示获取矩阵数据的子集,该子集包含所有行,但仅包含列ii之后出现的列 bsxfun(@minus,data(:,ii),data(:,ii + 1:end)) - >对于矩阵数据中的每一列(:,ii + 1:结束),减去单列数据(:,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中更改。要执行此操作,请单击mfile中k=0;
旁边的虚线,您将看到一个红点,然后运行代码。代码只会执行到点,您现在处于调试模式。如果将鼠标悬停在调试模式下的变量上,matlab将在工具提示中显示其内容。对于一个非常大的变量,请在工作区中查看它。现在逐行逐步执行代码并使用上面的解释来确保您了解每行如何更改每个变量。对于像b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));
这样更复杂的行,你应该突出显示代码片段并在命令行中破坏它们以查看每个部分正在做什么,例如运行data(:,ii)
以查看它的作用,然后尝试{{1}或者甚至只是data(:,ii+1:end))
(在这种情况下,它不会工作,用大小替换结束(数据,2))。调试是理解让您感到困惑的代码的最佳方式。
答案 1 :(得分:2)
bsxfun(@minus,A,B)
与
几乎相同A-B
不同之处在于bsxfun
版本将处理不同大小的输入:在每个维度(“方向”,如果您发现更容易思考这种方式),如果其中一个输入是标量并且另一个是向量,标量将简单地重复一次。