我试图表示一个简单的矩阵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
我怎么能让它在任意数量的行和列上运行?
感谢!
答案 0 :(得分:5)
我发现你的代码出了几个问题:
d = 3;
。这只是挑剔,但您可以安全地从代码中删除它。您没有正确进行电源操作。具体来说,看看这句话:
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
,您可以删除第一列的删除。
但是,我将在一行代码中以另一种方式执行此操作。在我们这样做之前,让我们来看看你想要做的事情的理论。
如果向量v
长m
个元素存储在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]
会看到bsxfun
和A
都有单身维度,其中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)