Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在matlab中生成该矩阵_Matlab_Matrix_Vectorization - Fatal编程技术网

如何在matlab中生成该矩阵

如何在matlab中生成该矩阵,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,H矩阵是n乘n,n=10000。我可以用loop在matlab中生成这个矩阵。我只是想知道是否有任何方法可以做到这一点而不在matlab中循环 您可以看到矩阵的右上部分由1/sqrt(n*(n-1))组成,对角线元素由-(n-1)/sqrt(n*(n-1))组成,第一列由1/sqrt(n)组成,其余元素为零 我们可以生成完整的矩阵,其中第一列包含所有1/sqrt(n),然后其余列包含1/sqrt(n*(n-1)),然后我们需要修改矩阵以包含所需的其余内容 因此,让我们集中讨论从第2行第2列开始的


H矩阵是n乘n,n=10000。我可以用loop在matlab中生成这个矩阵。我只是想知道是否有任何方法可以做到这一点而不在matlab中循环

您可以看到矩阵的右上部分由
1/sqrt(n*(n-1))
组成,对角线元素由
-(n-1)/sqrt(n*(n-1))
组成,第一列由
1/sqrt(n)
组成,其余元素为零

我们可以生成完整的矩阵,其中第一列包含所有
1/sqrt(n)
,然后其余列包含
1/sqrt(n*(n-1))
,然后我们需要修改矩阵以包含所需的其余内容

因此,让我们集中讨论从第2行第2列开始的元素,因为它们遵循一种模式。一旦我们完成了,我们就可以构建其他构建最终矩阵的东西

x = 2:n;
Hsmall = repmat([1./sqrt(x.*(x-1))], n-1, 1);
接下来,我们将讨论对角线元素:

Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
现在,让我们将其余元素归零:

Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
现在,我们已经完成了,让我们创建一个新的矩阵,将所有这一切结合在一起:

H = [1/sqrt(n) 1./sqrt(x.*(x-1)); repmat(1/sqrt(n), n-1, 1) Hsmall];
因此,完整代码为:

x = 2:n;
Hsmall = repmat([1./sqrt(x.*(x-1))], n-1, 1);
Hsmall(logical(eye(n-1))) = -(x-1)./sqrt(x.*(x-1));
Hsmall(tril(logical(ones(n-1)),-1)) = 0;
H = [1/sqrt(n) 1./sqrt(x.*(x-1)); repmat(1/sqrt(n), n-1, 1) Hsmall];
下面是一个
n=6
的示例:

>> H

H =

  Columns 1 through 3

         0.408248290463863         0.707106781186547         0.408248290463863
         0.408248290463863        -0.707106781186547         0.408248290463863
         0.408248290463863                         0        -0.816496580927726
         0.408248290463863                         0                         0
         0.408248290463863                         0                         0
         0.408248290463863                         0                         0

  Columns 4 through 6

         0.288675134594813         0.223606797749979         0.182574185835055
         0.288675134594813         0.223606797749979         0.182574185835055
         0.288675134594813         0.223606797749979         0.182574185835055
        -0.866025403784439         0.223606797749979         0.182574185835055
                         0        -0.894427190999916         0.182574185835055
                         0                         0        -0.912870929175277

由于您使用的是相当大的
n
10000
,因此您可能希望尽可能地压缩性能。 因此,您可以使用基于-


运行时测试

(一) 如果
n=10000
,则我端的运行时为-
经过的时间为0.457543秒

(二) 现在,作为最后的性能压缩练习,您可以使用本文中列出的更快的预分配方案编辑
out
的预分配步骤。因此,预分配步骤如下所示-

out(n,n) = 0;
使用此编辑代码的运行时为-
运行时间为0.400399秒


(三)
n=10000
的运行时间为1.306339秒。

@meng-很高兴我能帮上忙!这是一个有趣的问题。和往常一样,这是一个很好的解释!我自己也会选择triu+repmat,因此必须寻找其他方法:)让您始终快速地完成我的实现:)+1.@rayryeng虽然你的解释是最好的!!您在优化方面已经取得了长足的进步,特别是在bsxfun、unique、accumarray等方面!