MATLAB列表操作
假设我有一个代码段,如下所示: 案例1MATLAB列表操作,matlab,matrix,Matlab,Matrix,假设我有一个代码段,如下所示: 案例1 n = 20; for i = 2 : n mat = rand([2,i]); mat = [mat, mat(:,1)]; %add the first column to the last %feed the variable 'mat' to a function end 案例2 n = 10; list = []; for i = 1 : n a = rand([2,1]); b = rand([2,
n = 20;
for i = 2 : n
mat = rand([2,i]);
mat = [mat, mat(:,1)]; %add the first column to the last
%feed the variable 'mat' to a function
end
案例2
n = 10;
list = [];
for i = 1 : n
a = rand([2,1]);
b = rand([2,2])
list = [list, [a,b]];
end
通过这种方式,MATLAB给出了以下建议:
变量“mat”似乎在每个循环上改变大小。考虑加速分配。
变量“list”在每个循环上都会改变大小。考虑加速分配。
我是一个MATLAB新手,所以我想知道如何处理这个问题。如何在原生MATLAB风格中执行此操作?提前感谢。我将重点讨论第二个案例,因为这是唯一有意义的案例:
n = 10;
list = [];
for i = 1 : n
a = rand([2,1]);
b = rand([2,2])
list = [list, [a,b]];
end
对于每个循环,您在这里要做的是创建两个带有随机数的向量,a
和b
<代码>a具有维度2x1
,b
具有维度2x2
。然后,使用矩阵列表
将这两个元素连接起来
请注意,rand
的每个调用都是独立的,因此rand(2,3)
的行为方式与[rand(2,2),rand(2,1)]
相同
现在,由于您循环了10次,并且每次都添加rand(2,3)
,因此您实际上是在执行[rand(2,2),rand(2,1),rand(2,2),rand(2,1)…]
。这相当于兰德(2,30),速度要快得多。因此,“考虑预分配以提高速度。”
现在,如果连接不包含随机矩阵,但实际上是某个函数的输出,而该函数无法输出所需的整个矩阵,则使用索引预分配并将其插入矩阵: 让我们定义几个函数:
function x = loopfun(n)
x = n*[1; 2];
end
function list = myfun1(n)
list = zeros(2, n);
for ii = 1:n
list(:,ii) = loopfun(ii);
end
end
function list = myfun2(n)
list = [];
for ii = 1:n
list = [list, loopfun(ii)];
end
end
f1 = @() myfun1(100000); f2 = @() myfun2(100000);
fprintf('Preallocated: %f\nNot preallocated: %f\n', timeit(f1), timeit(f2))
Preallocated: 0.141617
Not preallocated: 0.318272
如您所见,具有预分配的函数的速度是具有增大矩阵的函数的两倍。如果迭代次数很少,则差异较小,但总体思路是相同的
f1 = @() myfun1(5); f2 = @() myfun2(5);
fprintf('Preallocated: %f\nNot preallocated: %f\n', timeit(f1), timeit(f2))
Preallocated: 0.000010
Not preallocated: 0.000018
我将重点讨论第二种情况,因为这是唯一有意义的情况:
n = 10;
list = [];
for i = 1 : n
a = rand([2,1]);
b = rand([2,2])
list = [list, [a,b]];
end
对于每个循环,您在这里要做的是创建两个带有随机数的向量,a
和b
<代码>a具有维度2x1
,b
具有维度2x2
。然后,使用矩阵列表
将这两个元素连接起来
请注意,rand
的每个调用都是独立的,因此rand(2,3)
的行为方式与[rand(2,2),rand(2,1)]
相同
现在,由于您循环了10次,并且每次都添加rand(2,3)
,因此您实际上是在执行[rand(2,2),rand(2,1),rand(2,2),rand(2,1)…]
。这相当于兰德(2,30),速度要快得多。因此,“考虑预分配以提高速度。”
现在,如果连接不包含随机矩阵,但实际上是某个函数的输出,而该函数无法输出所需的整个矩阵,则使用索引预分配并将其插入矩阵: 让我们定义几个函数:
function x = loopfun(n)
x = n*[1; 2];
end
function list = myfun1(n)
list = zeros(2, n);
for ii = 1:n
list(:,ii) = loopfun(ii);
end
end
function list = myfun2(n)
list = [];
for ii = 1:n
list = [list, loopfun(ii)];
end
end
f1 = @() myfun1(100000); f2 = @() myfun2(100000);
fprintf('Preallocated: %f\nNot preallocated: %f\n', timeit(f1), timeit(f2))
Preallocated: 0.141617
Not preallocated: 0.318272
如您所见,具有预分配的函数的速度是具有增大矩阵的函数的两倍。如果迭代次数很少,则差异较小,但总体思路是相同的
f1 = @() myfun1(5); f2 = @() myfun2(5);
fprintf('Preallocated: %f\nNot preallocated: %f\n', timeit(f1), timeit(f2))
Preallocated: 0.000010
Not preallocated: 0.000018
你能展示更多你的代码吗?有一些重要的部分丢失了,尤其是循环。还有,“将第一列添加到最后一列”是什么意思?是否要添加,如在
plus
中所示,或替换最后一列,或将其作为单独的列添加,以扩展矩阵(这就是您现在要做的)?问题是什么?@Studiegriffin感谢您的建议。事实上,我忘记了循环。这个片段毫无意义。在每个迭代步骤中创建一个新矩阵,然后追加一列,然后在下一个迭代步骤中再次覆盖。这相当于:mat=rand([2,20]);mat=[mat,mat(:,1)]代码>因此实际上不需要循环,您可以忘记警告。。。或者您可以指定要执行的操作。关于您的问题。。。google ing MATLAB+preallocation引导您:您能展示更多的代码吗?有一些重要的部分丢失了,尤其是循环。还有,“将第一列添加到最后一列”是什么意思?是否要添加,如在plus
中所示,或替换最后一列,或将其作为单独的列添加,以扩展矩阵(这就是您现在要做的)?问题是什么?@Studiegriffin感谢您的建议。事实上,我忘记了循环。这个片段毫无意义。在每个迭代步骤中创建一个新矩阵,然后追加一列,然后在下一个迭代步骤中再次覆盖。这相当于:mat=rand([2,20]);mat=[mat,mat(:,1)]代码>因此实际上不需要循环,您可以忘记警告。。。或者您可以指定要执行的操作。关于您的问题。。。google ing MATLAB+preallocation引导您来到这里:感谢您的回答。我用rand
来回答我的问题。实际上,a
和b
来自其他函数的返回值。根据我的实现,a
是2 x i
的矩阵,b
是2 x j
的矩阵,其中i
和j
的范围为1到5。感谢您的回答。我用rand
来回答我的问题。实际上,a
和b
来自其他函数的返回值。根据我的实现,a
是2xi
的矩阵,b
是2xj
的矩阵,其中i
和j
的范围为1到5。