Matlab:对for循环内的列进行算术运算(简单但不可靠!)

7ke*_*ani 0 matlab for-loop vector matrix dimensions

我试图表示一个简单的矩阵m*n(我们假设它只有一行!),使得m1n1 = m1n1 ^ 1,m1n2 = m1n1 ^ 2,m1n3 = m1n1 ^ 3,m1n3 = m1n1 ^ 4,.. .m1ni = m1n1 ^ i.换句话说,我试图在矩阵列上迭代n次以在末尾添加一个新的向量(列),使得每个索引具有与第一个向量相同的值但是被提升到其列号的幂ñ.

这是原始载体:

v =
    1.2421
    2.3348
    0.1326
    2.3470
    6.7389
这是第三次迭代后的v:

v = 
    1.2421    1.5429    1.9165
    2.3348    5.4513   12.7277
    0.1326    0.0176    0.0023
    2.3470    5.5084   12.9282
    6.7389   45.4128  306.0329
现在考虑到我是Matlab中的一个总菜鸟,我真的低估了这个看似简单的任务的难度,这花了我差不多一天的调试和网上冲浪找到任何线索.这是我提出的:

rows = 5;
columns = 3;
v = x(1:rows,1);
k = v;
Ncol = ones(rows,1);
extraK = ones(rows,1);

disp(v)

for c = 1:columns
    Ncol = k(:,length(k(1,:))).^c; % a verbose way of selecting the last column only.
    extraK = cat(2,extraK,Ncol);
end

k = cat(2,k,extraK);
disp(extraK(:,2:columns+1)) % to cut off the first column
Run Code Online (Sandbox Code Playgroud)

现在这个代码(出于一些奇怪的原因)仅在行= 6或更少,列= 3或更少时才起作用.

当rows = 7时,这是输出:

v = 1.0e+03 *

0.0012    0.0015    0.0019
0.0023    0.0055    0.0127
0.0001    0.0000    0.0000
0.0023    0.0055    0.0129
0.0067    0.0454    0.3060
0.0037    0.0138    0.0510
0.0119    0.1405    1.6654
Run Code Online (Sandbox Code Playgroud)

我怎么能让它在任意数量的行和列上运行?

谢谢!

ray*_*ica 5

我发现你的代码有些问题:

  1. 我不确定你为什么要定义d = 3;.这只是挑剔,但您可以安全地从代码中删除它.
  2. 您没有正确进行电源操作.具体来说,看看这个声明:

    Ncol = k(:,length(k(1,:))).^c; % a verbose way of selecting the last column only.
    
    Run Code Online (Sandbox Code Playgroud)

    您有选择地选择最后一列,这很好,但您没有正确应用电源操作.如果我理解你的说法,你希望把原来的载体,并执行电源操作的电源n,其中n是当前迭代.因此,您真的需要这样做:

    Ncol = k.^c;
    
    Run Code Online (Sandbox Code Playgroud)

    一旦你Ncol用上面的代码替换,代码现在应该可以工作了.我还注意到你裁剪出结果的第一列.您获得重复列的原因是因为您的for循环开始c = 1.既然你已经计算好了v.^1 = v,你就可以开始循环了c = 2.将循环起点更改为c = 2,您可以删除第一列的删除.


但是,我将在一行代码中以另一种方式执行此操作.在我们这样做之前,让我们来看看你想要做的事情的理论.

给定一个向量vm长期存储在元素m x 1向量,你想要的是有大小的矩阵m x n,其中n是列的期望数量,并且为每一列从左至右开始,你要采取vn幂.

因此,根据您的第三个"迭代"示例,第一列表示v,第二列表示v.^2,第三列表示v.^3.


我要向你介绍一下它的力量bsxfun. bsxfun代表 inary 小号 ingletonË X潘申功能.什么bsxfun所做的是,如果你有两个输入,其中之一或两者输入具有一个单维,或者如果任一的两个输入端具有一个,其具有值1维中,每个输入被在它们的单尺寸复制到符合其他的尺寸输入,然后将元素操作一起应用于这些输入以产生输出.

例如,如果我们有两个这样的向量:

A = [1 2 3]

B = [1
     2
     3]
Run Code Online (Sandbox Code Playgroud)

注意,其中一个是行向量,另一个是列向量. bsxfun会看到A并且B两者都有单例维度,其中A单例维度是行数为1,并且B具有单个维度,即列数为1.因此,我们将复制B尽可能多的列,A并且重复A对于尽可能多的行B,我们实际得到:

A = [1 2 3
     1 2 3
     1 2 3]

B = [1 1 1
     2 2 2
     3 3 3]
Run Code Online (Sandbox Code Playgroud)

一旦我们有了这两个矩阵,你就可以对这些矩阵应用任何元素操作来获得输出.例如,您可以添加,减去,获取幂或执行元素乘法或除法.


现在,此方案如何适用于您的问题如下.你正在做的是你有一个向量v,你将有一个像这样的矩阵:

M = [1 2 3 ... n
     1 2 3 ... n
     ...........
     ...........
     1 2 3 ... n]
Run Code Online (Sandbox Code Playgroud)

基本上,我们将有一列1,然后是一列2s,最多可以是你想要的列数n.我们将适用bsxfun于矢量v这是一个列向量,而另一个向量,这只是一个单列的值从1到n.您将应用电源操作来实现结果.因此,您可以通过执行以下操作方便地计算输出:

columns = 3;
out = bsxfun(@power, v, 1:columns);
Run Code Online (Sandbox Code Playgroud)

让我们尝试一些给出你的矢量的例子v:

>> v = [1.2421; 2.3348; 0.1326; 2.3470; 6.7389];
>> columns = 3;
>> out = bsxfun(@power, v, 1:columns)

out =

    1.2421    1.5428    1.9163
    2.3348    5.4513   12.7277
    0.1326    0.0176    0.0023
    2.3470    5.5084   12.9282
    6.7389   45.4128  306.0321

>> columns = 7;
>> format bank
>> out = bsxfun(@power, v, 1:columns)

out =

  Columns 1 through 5

          1.24          1.54          1.92          2.38          2.96
          2.33          5.45         12.73         29.72         69.38
          0.13          0.02          0.00          0.00          0.00
          2.35          5.51         12.93         30.34         71.21
          6.74         45.41        306.03       2062.32      13897.77

  Columns 6 through 7

          3.67          4.56
        161.99        378.22
          0.00          0.00
        167.14        392.28
      93655.67     631136.19
Run Code Online (Sandbox Code Playgroud)

请注意,要将列设置为3,我们会得到您在帖子中看到的内容.为了将列推到7,我不得不改变数字的显示方式,这样你就可以清楚地看到数字了.不这样做会使这成为指数形式,并且有效数字后面有很多零.


祝好运!

  • 男人,你打字速度如此快......我正在准备完全相同的答案(甚至更少的解释),到我完成的时候,我看到你的答案就在很久以前!干得好. (2认同)