MATLAB列表操作

MATLAB列表操作,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,

假设我有一个代码段,如下所示:

案例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,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。