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