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)
我怎么能让它在任意数量的行和列上运行?
谢谢!
我发现你的代码有些问题:
d = 3;.这只是挑剔,但您可以安全地从代码中删除它.您没有正确进行电源操作.具体来说,看看这个声明:
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,您可以删除第一列的删除.
但是,我将在一行代码中以另一种方式执行此操作.在我们这样做之前,让我们来看看你想要做的事情的理论.
给定一个向量v是m长期存储在元素m x 1向量,你想要的是有大小的矩阵m x n,其中n是列的期望数量,并且为每一列从左至右开始,你要采取v的n次幂.
因此,根据您的第三个"迭代"示例,第一列表示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,我不得不改变数字的显示方式,这样你就可以清楚地看到数字了.不这样做会使这成为指数形式,并且有效数字后面有很多零.
祝好运!