【问题标题】:"Filling up" an empty vector in Matlab by a for loop通过 for 循环“填充”Matlab 中的空向量
【发布时间】:2016-03-09 17:19:41
【问题描述】:

我正在尝试在 MATLAB 中创建一个循环代码,以“填充”大小为 l x 1 的空列向量中的元素,称为 m。由于我在 MATLAB 方面没有太多经验,我不确定这是否是正确的方法。

注意:由于i属于matlab中的复数,我将数组的第i个元素表示为ii-th 元素。

l=length(A);         %The number of rows in the empty vector we seek as our output;
                     %so as to preallocate space for this vector.

q=eigencentrality(A);%An lx1 column vector whose ii-th elements are used in the loop.
l1=max(eig(A));      %A scalar used in the loop.
CS=sg_centrality(A); %%An lx1 column vector whose ii-th elements are used in the loop.

                     %Now for the actual loop that will "fill up" each ii-th entry
                     %of our empty vector, m.

m=NaN(l,1);          %create the empty vector to be "filled up".
for ii=1:l
   m(ii,:)=log(q(ii)^2)*sinh(l1)/CS(ii)^1/2;%this is the form that I want each entry
                                            %of m to have. Note how the ii-th element
                                            %of m depends on the corresponding ii-th
                                            %element of CS and q!
end

这是“填充”这样一个空列向量的正确方法吗,m,其条目取决于上述其他两个向量的对应元素?

干杯!

【问题讨论】:

  • 这可能更适合 Code Review ,因为这似乎是函数代码。
  • 写虚数单位的recommended way1i1j
  • @beaker 关键是,如果您的所有其他代码始终遵循使用1i 的推荐做法,而不是假设i 是虚数单位,那么它会更健壮。
  • @200_success 我承认l1 看起来令人困惑,但它实际上是ELL-ONE,而不是虚构的单位1i。事实上,代码中没有任何内容引用虚数单位......也许l1应该重命名为其他东西。

标签: matlab loops for-loop vector vectorization


【解决方案1】:

您可以矢量化所有操作,而无需使用 for 循环。这应该有效:

m=log(q.^2).*(sinh(l1)./CS).^1/2;

请注意,点表示元素操作。通常这比使用循环要快得多。另外,顺便说一句,您可以删除预分配。

【讨论】:

    【解决方案2】:

    您可以完全矢量化。矢量化是一次处理数据块的行为,而不是像您在代码中那样单独处理。事实上,这是 MATLAB 的主要优势之一。您可以将 for 循环替换为:

     m = log(q.^2).*(sinh(l1)./CS).^1/2;
    

    .*.^ 运算符被称为 element-wise 运算符。这意味着qliCS 中的每个值都将有助于输出中的相应位置。没有必要使用循环。

    在此处查看有关向量化的 MathWorks 说明:http://www.mathworks.com/help/matlab/matlab_prog/vectorization.html

    【讨论】:

    • 不错。三个建议矢量化的答案在 10 秒内发布:)
    • @mikkola 哈哈哈我知道是吗?我一发帖,你们俩都回复了。我正在考虑是否应该现在删除这个答案。
    • 是的,你应该这样做。如果你还没有,你会得到一个徽章:D
    • @Dev-iL aw man...我距离 200 个代表还有 5 个代表。我正在考虑是否应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2018-09-14
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多