有人能解释一下下面的代码片段吗?我没有计算机科学或编程方面的背景,最近才开始了解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发布于 2012-08-02 16:26:34
从零开始
kk=0; 循环,ii从1到N-1,每次迭代递增1。在matlab的命令行中输入1:10,您将看到它输出了1 2 3 4 5 6 7 8 9 10。冒号运算符是matlab中一个非常重要的运算符。
for ii=1:N-1 b{ii} = ...这只是在单元向量b的下一个元素中存储一个矩阵。单元数组可以在它们的每个元素中保存任何内容,这是必要的,因为在这种情况下,每次迭代都会创建一个比前一次迭代少一列的矩阵。data (:,ii) -->只获取矩阵数据的第i列data(:,ii+1:end)表示获取矩阵数据的一个子集,该子集由所有行组成,但只包含列ii之后的列bsxfun(@-,data(:,ii),data(:,ii+1:end)) -->对于矩阵data(:,ii+1:end)中的每一列,减去单列data(:,ii)
b{ii} = bsxfun(@minus,data(:,ii),data(:,ii+1:end));%这与上面的行做同样的事情,但不是将循环的结果矩阵存储在单元数组的单独单元中,而是将新矩阵附加到原始数组中。请注意,新矩阵每次将具有相同的行数,但少了一列,因此这将作为新列附加。%c(:,kk + (1:N-ii)) = ....--> So 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)来查看它的作用,然后尝试data(:,ii+1:end)),甚至只尝试ii+1:end (在这种情况下,它不起作用,将end替换为size(data,2))。调试是理解令您困惑的代码的最佳方法。
发布于 2012-08-02 15:34:01
bsxfun(@minus,A,B)几乎与
A-B不同之处在于,bsxfun版本将处理不同大小的输入:在每个维度(“方向”,如果您觉得这样更容易思考),如果一个输入是标量输入,另一个是向量输入,则标量输入将被重复足够频繁。
http://www.mathworks.com/help/techdoc/ref/bsxfun.html
https://stackoverflow.com/questions/11772236
复制相似问题