【问题标题】:Add element to the front of a vector, without knowing if it is a row or column vector?将元素添加到向量的前面,而不知道它是行向量还是列向量?
【发布时间】:2020-07-27 07:37:54
【问题描述】:

如果我在行向量 x 中添加一个 newvlaue,它将是

x = [newvlue, x] % use of ,

但是如果是一个列向量x,那就是

x = [newvlue; x] % use of ;

所以我必须提前知道它是行向量还是列向量才能执行此前插入。但我可能并不总是知道 x 意味着用户输入。所以每次我需要事先执行这个行向量或列向量检查。但是,假设我真的不想关心它是行向量还是列向量,我只需要在数组的前面添加一个元素。有没有什么优雅的方式来写代码?

【问题讨论】:

  • 我不确定,但是添加到向量的末尾应该比添加到前面更有效
  • @rahnema1 哈哈...这当然是答案:)(见下文...)

标签: arrays matlab


【解决方案1】:

您必须检查输入的尺寸:

x = [1, 2, 3]
% or
x = [1; 2; 3]
new = 0;

% flexible concatenation
y = cat(~(size(x,1) > 1) + 1, new ,x)

说明

d = size(x,1) > 1   % check if column (=1) or row vector (>1)
z = ~(d) + 1        % results in either 1 or 2 for column or row vector
                    % as input for cat
y = cat(z, new ,x)  % concatenate in correct dimension

或者按照ThomasIsCoding's answer 中的建议使用isrow,但我想它几乎是一样的:

z = isrow(x) + 1;

您应该以任何方式使用isvector 来检查输入是否实际上是向量而不是矩阵。但实际上我建议使用

将任何输入、行或列向量转换为列向量
x = x(:)

允许在您的基础函数中进行编码。

【讨论】:

  • 最重要的是x = x(:)。将所有向量转换为已知方向会更容易。
【解决方案2】:

我喜欢单线,试试这个

a(1:end+1)=[100;a(:)]

适用于行矩阵和列矩阵。

【讨论】:

    【解决方案3】:

    作为@rahnema1 said,只需将新值添加到末尾即可:

    x = flip(x); 
    x(end+1) = newvalue; 
    x = flip(x);
    

    【讨论】:

    • 您可以注意到添加到向量的末尾是用amortized constant 时间完成的,而连接需要重新分配。但是,如果在执行大量附加的循环之前和之后进行翻转,那么您的方法将是最有效的答案。
    • @rahnema1 我仍然认为 Daniel 和 FangQ 的答案会更快,特别是如果事先知道要插入的元素数量。
    【解决方案4】:

    也许你可以像下面这样定义你的自定义函数

    function y = addhead(x,val)
      if isrow(x)
        y = horzcat(val,x);
      else
        y = vertcat(val,x);
      end
    end
    

    【讨论】:

      【解决方案5】:

      您可以使用索引将所有元素移动 1,然后在开头插入新元素。

      x(2:end+1)=x;
      x(1)=7;
      

      【讨论】:

      • 太简单了。
      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多