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

时间:2015-02-01 00:36:14

标签: matlab for-loop matrix vector 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

现在这个代码(出于一些奇怪的原因)只有在行= 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

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

感谢

2 个答案:

答案 0 :(得分:5)

我发现你的代码出了几个问题:

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

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

    您有选择地选择最后一列,这很棒,但您没有正确应用电源操作。如果我理解您的陈述,您希望采用原始向量,并执行幂n的幂次操作,其中n是当前迭代。因此,您真的需要这样做:

    Ncol = k.^c;
    

    使用上面的代码替换Ncol后,代码现在应该可以运行了。我还注意到你裁剪出结果的第一列。您获得重复列的原因是因为for循环从c = 1开始。由于您已经计算了v.^1 = v,因此您可以在c = 2开始循环。将您的循环起点更改为c = 2,您可以删除第一列的删除。


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

    如果向量vm个元素存储在m x 1向量中,那么你想要的是一个大小为m x n的矩阵,其中{{1}是所需的列数,对于从左到右开始的每列,您希望n获得v th 的力量。

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


    我将向您介绍bsxfun的力量。 v.^3代表 B inary S ingleton E X pansion函数。 bsxfun的作用是,如果您有两个输入,其中一个或两个输入都具有单个维度,或者两个输入中的任何一个具有一个值为1的维度,则每个输入为以单个维度复制以匹配其他输入的大小,然后对这些输入应用元素操作以产生输出。

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

    bsxfun

    请注意,其中一个是行向量,另一个是列向量。 A = [1 2 3] B = [1 2 3] 会看到bsxfunA都有单身维度,其中B的单个维度是行数为1,而A具有单个维度,即列数为1.因此,我们将复制B列与B中的列一样多,并且复制A的行数与{A一样多。 1}},我们实际得到:

    B

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


    现在,此方案如何适用于您的问题如下。你正在做的是你有一个向量A = [1 2 3 1 2 3 1 2 3] B = [1 1 1 2 2 2 3 3 3] ,你将拥有一个矩阵的权力:

    v

    基本上,我们将有一列1,然后是一列2s,最多可以列为M = [1 2 3 ... n 1 2 3 ... n ........... ........... 1 2 3 ... n] 列。我们将n应用于作为列向量的向量bsxfun,将另一个向量应用于从1到v单行值。您将应用电源操作来实现结果。因此,您可以通过执行以下操作方便地计算输出:

    n

    让我们尝试一下给定矢量columns = 3; out = bsxfun(@power, v, 1:columns);

    的几个例子
    v

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


    祝你好运!

答案 1 :(得分:2)

计算累积功效时,您可以重复使用之前的结果:对于标量xnx.^n等于x * x.^(n-1),其中{ {1}}已经获得。这可能比单独计算每个功率更高效,因为乘法比功率更快。

x.^(n-1)成为所需的最大指数。要使用所描述的方法,列向量N将水平重复v次(repmat),然后沿每行(cumprod)应用累积产品:< / p>

N