Performance 从1 x n向量生成一个n x n-1矩阵,其中第i行是没有第i元素的向量,没有for循环
对于拉格朗日多项式,我需要这个。我很好奇,如果没有Performance 从1 x n向量生成一个n x n-1矩阵,其中第i行是没有第i元素的向量,没有for循环,performance,matlab,matrix,vectorization,matrix-multiplication,Performance,Matlab,Matrix,Vectorization,Matrix Multiplication,对于拉格朗日多项式,我需要这个。我很好奇,如果没有for循环,人们会怎么做。当前代码如下所示: tj = 1:n; ti = zeros(n,n-1); for i = 1:n ti(i,:) = tj([1:i-1, i+1:end]); end 我的tj实际上不仅仅是一个1:n向量,但这并不重要。虽然这个for循环完成了任务,但我宁愿使用一些矩阵运算。我试着寻找一些合适的矩阵将其相乘,但到目前为止运气不佳。这应该推广到任何n ti = flipud(reshape(repmat(1
for
循环,人们会怎么做。当前代码如下所示:
tj = 1:n;
ti = zeros(n,n-1);
for i = 1:n
ti(i,:) = tj([1:i-1, i+1:end]);
end
我的
tj
实际上不仅仅是一个1:n
向量,但这并不重要。虽然这个for
循环完成了任务,但我宁愿使用一些矩阵运算。我试着寻找一些合适的矩阵将其相乘,但到目前为止运气不佳。这应该推广到任何n
ti = flipud(reshape(repmat(1:n, [n-1 1]), [n n-1]));
仔细看看发生了什么。如果你仔细观察得到的矩阵,你会发现它是从下到上的n-1
1、n-1
2等
用于n
为3的情况。
ti =
2 3
1 3
1 2
所以我们可以垂直翻转这个,得到
f = flipud(ti);
1 2
1 3
2 3
实际上,这是[1,2,3;1,2,3]
被重塑为3x2而不是2x3
按照这种思路
a = repmat(1:3, [2 1])
1 2 3
1 2 3
b = reshape(a, [3 2]);
1 2
1 3
2 3
c = flipud(b);
2 3
1 3
1 2
现在,我们回到了您开始的位置,我们将所有内容组合在一起,将3替换为n
,将2替换为n-1
以下是一种方法:
v = [10 20 30 40]; %// example vector
n = numel(v);
M = repmat(v(:), 1, n);
M = M(~eye(n));
M = reshape(M,n-1,n).';
给予
还有一种方法。首先创建一个矩阵,其中每一行都是向量
tj
,但它们相互叠加。接下来,提取矩阵的上下三角部分而不提取对角线,然后将结果相加,确保删除下三角矩阵的最后一列和上三角矩阵的第一列
n = numel(tj);
V = repmat(tj, n, 1);
L = tril(V,-1);
U = triu(V,1);
ti = L(:,1:end-1) + U(:,2:end);
查找我们存储在n
中的tj
中的值总数。有助于向量tj
的堆叠,以创建一个nxn
大的矩阵。之后,我们使用and,以便在不使用对角的情况下提取矩阵的上下三角部分。此外,除相关三角形部分外,矩阵的其余部分均为零。tril
和triu
的-1
和1
标志分别成功地将其提取出来,同时确保对角线均为零。这将创建一列额外的零,在调用tril
时显示在最后一列,在调用triu
时显示在第一列。最后一部分是简单地将这两个矩阵相加,忽略tril
结果的最后一列和triu
结果的第一列
假设tj=[10203040]代码>(借用路易斯·门多的例子),我们得到:
n = numel(tj);
V = repmat(tj, n, 1);
L = tril(V,-1);
U = triu(V,1);
ti = L(:,1:end-1) + U(:,2:end);
ti =
20 30 40
10 30 40
10 20 40
10 20 30