Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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_Diagonal - Fatal编程技术网

Matlab中的扩展块对角矩阵

Matlab中的扩展块对角矩阵,matlab,matrix,diagonal,Matlab,Matrix,Diagonal,我知道,要在Matlab中生成块对角矩阵,命令blkdiag会生成这样一个矩阵: 现在,我面临着生成相同的块对角矩阵,但也有矩阵元素B_1,B_2,…,B_{n-1}在上对角线上,其他地方为零: 我想这可以用循环硬编码,但我想找到一个更优雅的解决方案。关于如何实施这样的事情,有什么想法吗? p.S.I命令,使用diag(A,k)返回kth对角线。我需要一些东西来写入矩阵,对于k>0,对于块矩阵,不仅仅是元素。这可能是一种基于,&的方法- %// Take all A1, A2, A3,

我知道,要在Matlab中生成块对角矩阵,命令
blkdiag
会生成这样一个矩阵:

现在,我面临着生成相同的块对角矩阵,但也有矩阵元素
B_1
B_2
,…,
B_{n-1}
在上对角线上,其他地方为零:

  • 我想这可以用循环硬编码,但我想找到一个更优雅的解决方案。关于如何实施这样的事情,有什么想法吗?


p.S.I命令,使用
diag(A,k)
返回
k
th对角线。我需要一些东西来写入矩阵,对于
k
>0,对于块矩阵,不仅仅是元素。

这可能是一种基于&的方法-

%// Take all A1, A2, A3, etc in a cell array for easy access and same for B
A = {A1,A2,A3,A4}
B = {B1,B2,B3}

%// Setup output array with the A blocks at main diagonal
out = blkdiag(A{:})

%// logical array with 1s at places where kth diagonal elements are to be put
idx = kron(triu(true(numel(A)),k) & tril(true(numel(A)),k),ones(size(A{1})))>0

%// Put kth diagonal blocks using the logical mask
out(idx) = [B{1:numel(A)-k}]
使用
k=1运行
2x2
矩阵的样本-

>> A{:}
ans =
    0.3467    0.7966
    0.6228    0.7459
ans =
    0.1255    0.0252
    0.8224    0.4144
ans =
    0.7314    0.3673
    0.7814    0.7449
ans =
    0.8923    0.1296
    0.2426    0.2251
>> B{:}
ans =
    0.3500    0.9275
    0.2871    0.0513
ans =
    0.5927    0.8384
    0.1629    0.1676
ans =
    0.5022    0.3554
    0.9993    0.0471
>> out
out =
    0.3467    0.7966    0.3500    0.9275         0         0         0         0
    0.6228    0.7459    0.2871    0.0513         0         0         0         0
         0         0    0.1255    0.0252    0.5927    0.8384         0         0
         0         0    0.8224    0.4144    0.1629    0.1676         0         0
         0         0         0         0    0.7314    0.3673    0.5022    0.3554
         0         0         0         0    0.7814    0.7449    0.9993    0.0471
         0         0         0         0         0         0    0.8923    0.1296
         0         0         0         0         0         0    0.2426    0.2251

文件交换上有一个提交可以执行此操作:

如果为函数提供三个三维阵列,则三维阵列的每一层表示主、次或超对角线的块。(这意味着块必须具有相同的大小。)结果将是一个稀疏矩阵,因此它在内存方面应该相当有效

一个示例用法是:

As = bsxfun(@times,ones(3),permute(1:3,[3,1,2]));
Bs = bsxfun(@times,ones(3),permute(10:11,[3,1,2]));
M = blktridiag(As, zeros(size(Bs)), Bs);
其中
full(M)
为您提供:

 1     1     1    10    10    10     0     0     0
 1     1     1    10    10    10     0     0     0
 1     1     1    10    10    10     0     0     0
 0     0     0     2     2     2    11    11    11
 0     0     0     2     2     2    11    11    11
 0     0     0     2     2     2    11    11    11
 0     0     0     0     0     0     3     3     3
 0     0     0     0     0     0     3     3     3
 0     0     0     0     0     0     3     3     3

可以使用
diag(Elements,k)
设置第k对角线上的元素。但问题是关于块对角矩阵,即A1,A2。。是矩阵本身。@Divarak,是的,我指的是块矩阵,不是元素!无论如何,谢谢:)这似乎就是我要找的!