【问题标题】:matlab concatenating vectorsmatlab 连接向量
【发布时间】:2023-03-09 13:35:01
【问题描述】:

我是 MATLAB 的新手,并且是一般的编程新手,但我很难完成我确信这是一项非常非常简单的任务:

我有一个向量 v_i 的列表,用于 i 从 1 到 n(某个数字中的 n),所有的大小都相同。我想创建一个向量 v ,它是这些向量的“串联”(不知道这是否是正确的术语),按递增顺序排列:我的意思是 v 的前 k 个条目是 k 个条目v_1 的 k+1 到 2k 个条目是 v_2 的 k 个条目等等。因此 v 是一个长度为 nk 的向量。

我应该如何创建 v?

为了说明这一点,这是我开始编写的函数(rpeakindex 将只是一个向量,roughq 将是我之前提到的向量 v):

function roughq = roughq(rpeakindex)
for i from 1 to size(rpeakindex) do
    v_i = [rpeakindex(i)-30:1:rpeakindex(i)+90]
end

感谢任何帮助

【问题讨论】:

  • 向量列表是什么意思?元胞数组还是二维矩阵?
  • @User1551892 好吧,我已经开始编写一个定义向量 v_i 的函数
  • 如果您的目标是创建一个长向量(实际上称为“连接”),您可以简单地编写 v = [v_1, v_2, v_3, v_4]; 如果v_i 是其他计算的结果。你能发布一些你正在使用的代码吗?
  • @User1551892 如果有意义的话,我希望这个向量 v 将成为输出

标签: matlab vector


【解决方案1】:

horzcat 连接绝对是一种选择,但由于这些向量是在函数中创建的,因此最好在函数本身中自动连接这些向量,而不是手动写出horzcat(v1,v2,....vn)

鉴于问题中提到的功能,我建议如下:

function v = roughq(rpeakindex)
v = zeros(121,length(rpeakindex));                  %// create a 2D array of all zeros
for i = 1:size(rpeakindex) 
    v(:,i) = [rpeakindex(i)-30:1:rpeakindex(i)+90]; %// set result to ith column of v
end
v = v(:)';                                          %'//reshape v to be a single vector with the columns concatenated
end

下面是一个简单的例子:

N = 3;
v = zeros(5,N);
for i = 1:N
    v(:,i) = (1:5)*i;
end
v = v(:)';

输出:

v =

     1     2     3     4     5     2     4     6     8    10     3     6     9    12    15

您可能需要阅读 MATLAB 的 colon operator 以了解 v(:) 语法。

【讨论】:

  • 这真的很接近我正在寻找的东西,非常感谢。但我不能完全让它作为一个函数工作。我想做一个函数,它的输入是向量 rpeakindex,输出是你的向量 v。我该怎么写呢?
  • @neil 查看我编辑的答案。我刚刚添加了一行代码,将代码变成了一个名为 roughq 的函数,该函数将向量 rpeakindex 作为输入并输出 v
  • 感谢一百万。我遇到了最后一个问题。当我将向量 x 输入到函数 roughq 并用分号结束语句时,我的输出不会被抑制。你知道为什么会这样吗?
  • @neil 那是我的错。 :P 我忘记了代码中的分号。它应该在最新的编辑中得到修复。
  • @neil 不客气。如果您是 MATLAB 新手,我建议您观看 this video 以熟悉基础知识。
【解决方案2】:

如果您的意思是 2d 矩阵,则用于保存向量并且每一行都保存向量 v,那么您可以简单地在 matlab 中使用 reshape 命令,如下所示:

V = [] ;    
for i = 1:10
   V(i,:) = randi (10,1 ,10) ;
end     
V_reshpae = reshape (V, 1, numel(V)) ;

【讨论】:

    【解决方案3】:

    让我们尝试两件事。

    首先,对于连接向量,有几种方法here,但最简单的是

    h = horzcat(v_1, v_2);
    

    更大的问题是用“for”循环枚举所有向量。如果您的v_n 向量在一个元胞数组中,并且它们实际上是v{i},那么

    h= [];
    for j=1:n
     h = horzcat(h, v{i});
    end
    

    最后,如果他们只是名字不同,那么用

    来称呼他们
    h=[];
    for j=1:n
     h= horzcat(h, eval(sprintf('v_%d',j));
    end
    

    【讨论】:

      【解决方案4】:

      设数组(向量)为:

      v_1=1:10;
      v_2=11:20;
      v_3=21:30;
      v_4=31:40;
      

      等等。

      如果它们很少(例如4个),您可以直接将then设置为cat函数中的输入:

      v=cat(2,v_1,v_2,v_3,v_4)
      

      horzcat 函数

      v=horzcat(v_1,v_2,v_3,v_4)
      

      否则您可以在循环中使用eval 函数

      v1=[];
      for i=1:4
         eval(['v1=[v1 v_' num2str(i) ']'])
      end   
      

      希望这会有所帮助。

      【讨论】:

      • 在这种情况下你真的应该使用int2str。但是,如果必须求助于涉及 eval 的任何解决方案来解决此类问题,则代码的其他部分可能需要重组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多