我正在尝试创建一个最小二乘问题,该问题变为Cx = d的最小范数问题。我正在尝试为需要
的C创建一个数组C = [A^(N-1)*B, A^(N-2)*B, A^(N-3)*B, B]
最后一个元素只是B。
A
是2x2
矩阵,而B
是2x1
矩阵。
这是我到目前为止尝试过的。
C = zeros(2,length(N));
for i = 1:N
h = A.^(i-1)
l = h.*B
C(2,i) = l
end
答案 0 :(得分:0)
您的方法很好,代码中只有一个小缺陷:.
A = rand(2);
B = rand(2,1);
N = 3
C = zeros(2,length(N));
for i = 1:N
h = A.^(i-1); % power every element of the matrix
l = h*B; % This is a matrix-vector multiplication
C(2,i) = l;
end
请注意,.*
和简单的*
之间是有区别的。第一个将明智地应用乘法元素-在您的情况下[A(:,1)*B, A(:,2)*B]
;第二个执行matrix-vector multiplication。
现在还不清楚您是否确实打算使用A.^(i-1)
,或者是否要计算写成A^(i-1)
...的矩阵逆矩阵。
答案 1 :(得分:0)
从数学上讲,由于矩阵C
可以重写为以下格式
C = [A^(N-1),A^(N-2),...,A,I_2]*Kronecker(I_N,B)
其中I_N是维度N的单位矩阵。
然后,我们可以使用下面的代码来实现
# create a cell array to represent [A^(N-1),A^(N-2),...,A,I], in the k^th each cell of As is the matrix A^(N-k)
As = arrayfun(@(k) A^k, [N-1:-1:0], 'UniformOutput',false);
# concatenate all matrix in As by [As{:}], then also use kron(eye(numel(As)),B) to construct the block diagonal matrix consisting of B
C = [As{:}]*kron(eye(numel(As)),B);
带有虚拟数据的示例
A = [1,2;3,4];
B = (1,0.5);
N = 4;
如此
C =
64.0000 12.0000 2.0000 1.0000
140.0000 26.0000 5.0000 0.5000