【问题标题】:How to overwrite part of a vector?如何覆盖向量的一部分?
【发布时间】:2013-12-02 02:50:59
【问题描述】:

鉴于以下情况,我正在尝试重写向量的一部分: t = -10:.1:10 x = exp((-3.*t); x 的长度为 201,我想重写前 100 个值。 我开始工作的唯一方法就是这样做:

编辑修正错字。

t = 0:.1:10;
x = exp((-3.*t); % EDIT: THERE WAS A TYPO HERE
z = zeros(1,100);
for k = 1 : 100
x(k) = z(k);
end

共有三个问题。第一:什么是更快、更有效的方法?第二:如果我不想覆盖代码的第一部分而是中间或第二部分,我该怎么办?第三:有没有办法利用 t 的全部范围 t = -10:.1:10 而只是忽略前半部分而不是为其编写一个全新的变量?

首先:我尝试过的其他方法都没有成功。

第二:我能想到的唯一方法是将两个向量附加在一起,但它不会覆盖数据,所以这是不行的。

第三:我尝试了一个 if 语句,但根本不起作用。

【问题讨论】:

    标签: matlab for-loop vector overwrite


    【解决方案1】:

    您的代码似乎将某些内容分配给y,然后更改了x 的值。我认为这是一个错字 - 而不是您真正想要解决的问题。

    一般来说,如果你有

    t = -10:0.1:10;  % my preference: t = linspace(-10,10,201);
    

    和

    y = exp(-3 * t );
    

    但你想将 y 的前 100 个元素设置为零,你可以这样做

    y(1:100) = 0;
    

    如果你一开始就不想计算 y(1:100),你可以这样做

    y = zeros(size(t));
    y(101:end) = exp(-3 * t(101:end));
    

    这有很多变化。我认为上面的代码示例解决了您的所有三个问题。

    【讨论】:

    • 我不同意linspace 一定是更好的选择。在第一种情况下(10:0.1:10),很清楚每个值之间的间距是多少。我见过太多人试图用 linspace 复制它,而改用 linspace(-10,10,200)。此外,如果你真的对它进行基准测试,linspace 比第一种方法要慢得多。
    • @MrAzzaman 感谢您的评论。我说“更好”只是因为您可以“确定”控制您将拥有多少样本,并且它们是等距的。它避免了-1:0.3:1 不以1 结尾的问题。我同意每个人都有优点和缺点 - 但我通常更关心“第一个和最后一个元素”。我可能夸大了它“更好”。我应该说“我更喜欢”。
    【解决方案2】:

    改变你的

    for k = 1 : 100
      x(k) = z(k);  % i think it should be y(k) though
    end
    

    到

    x(1:100) = 0;
    

    【讨论】:

      【解决方案3】:

      您可以使用逻辑索引;也就是说,您可以使用逻辑语句来选择向量/矩阵的元素:

      t = -10:0.1:10;
      x = exp((-3.*t);
      x(t < 0) = 0;
      

      这也适用于矩阵的中间:

      x(t > -5 & t < 5) = whatever;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 2012-08-02
        • 1970-01-01
        • 2021-04-25
        相关资源
        最近更新 更多