Matlab 版 (精华区)

发信人: hahn (有奇~~Not Over But another Start...), 信区: Matlab
标  题: [合集] 如何同时(矢量化地)对多个矩阵作矩阵乘?
发信站: 哈工大紫丁香 (Wed Jan 24 00:47:57 2007), 站内

────────────────────────────────────────
  nc (nc)                          于  (Tue Jul 25 10:32:38 2006)  说道:

先谢过了!

用什么存储方式可实现此目的?


我只知道用3维数组,3维数组每页是个矩阵。
但不知如何同时操作各矩阵

假设一3维数组 X = rand(3,5,8); 
如下循环可实现对 X 各页矩阵的操作:

Y = zeros(5,5,8);
for SSS = 1:8
     Y(:,:,SSS) = X(:,:,SSS)' * X(:,:,SSS);
end

现在的问题是如此循环操作太慢(实际中X远多于8页)
请问如何实现对各页同时操作,即进行矢量化的运算?

谢谢大家指教!




────────────────────────────────────────
  zjliu (秋天的萝卜)               于  (Tue Jul 25 11:52:43 2006)  说道:

试试
.*

【 在 nc (nc) 的大作中提到: 】
: 先谢过了!
: 用什么存储方式可实现此目的?
: 我只知道用3维数组,3维数组每页是个矩阵。
: ...................



────────────────────────────────────────
  nc (nc)                          于  (Tue Jul 25 12:17:38 2006)  说道:

谢谢!

是对三维数组作 .* 吗?这个倒是能行的
但我还需要"矩阵相乘",各页矩阵的转置乘各页矩阵,这个能行吗?

有没有什么函数对三维数组是一页一页地操作的,也许可从中得到一些启示

【 在 zjliu (秋天的萝卜) 的大作中提到: 】
: 试试
: .*




────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Tue Jul 25 12:46:29 2006)  说道:

可以啊
[:,:,N]这样引用就表示第N页,如果你的第三维表示页的话
[:,:,N]'*[:,:,N]就是其转置和其本身相矩阵乘..

【 在 nc (nc) 的大作中提到: 】
: 谢谢!
: 是对三维数组作 .* 吗?这个倒是能行的
: 但我还需要"矩阵相乘",各页矩阵的转置乘各页矩阵,这个能行吗?
: ...................



────────────────────────────────────────
  nc (nc)                          于  (Tue Jul 25 17:01:27 2006)  说道:

谢谢

分页是可以的,但这样引用就需要循环对各页矩阵操作

我想要的是同时对各页作这样的操作
即:类似对数组各元素进行矢量化运算,实现对三维数组各页的矢量化运算
难在对各页矩阵的运算是矩阵乘,这样确实不便引用

真怀疑matlab支持这样作不,矩阵乘只支持二维(当然,矩阵本身就是二维数组)
就没有弥补一下循环效率低的办法了吗?


我理解了你的意思吗?


【 在 hahn (有奇@选择遗忘的自由) 的大作中提到: 】
: 可以啊
: [:,:,N]这样引用就表示第N页,如果你的第三维表示页的话
: [:,:,N]'*[:,:,N]就是其转置和其本身相矩阵乘..



────────────────────────────────────────
  nc (nc)                          于  (Tue Jul 25 18:41:16 2006)  说道:

这个问题是我实际需求的简化
我的应用中,实际是要求最小二乘法残差的正交投影矩阵
即:对多个 m×n 矩阵 X ,分别求 eye(m) - A * inv(A'*A) * A'

要是没有求逆矩阵的操作,还可以用分块对角稀疏矩阵的办法加速运算

可是分块对角矩阵规模太大,求逆操作就太费时了
整体上还不如各矩阵循环计算,真是顾首不顾尾

大家帮看看有没有比 inv()函数更快的办法,求大规模分块对角稀疏矩阵的逆
这是另一可能的办法

先谢了!


【 在 nc (nc) 的大作中提到: 】
: 用什么存储方式可实现此目的?
: 我只知道用3维数组,3维数组每页是个矩阵。
: ...................



────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Wed Jul 26 07:18:54 2006)  说道:

你这个想法非常好,
非循环操作是比较省时间
我还想不出来怎么具体做,
但是非循环操作占用的内存太大,可能导致cache命中急剧骤减
完成时间也可能不短
如果做计算或非实时仿真,实效性要求应该是不会很高。


【 在 nc (nc) 的大作中提到: 】
: 谢谢
: 分页是可以的,但这样引用就需要循环对各页矩阵操作
: 我想要的是同时对各页作这样的操作
: ...................



────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Wed Jul 26 07:32:11 2006)  说道:

inv函数是经过优化的
你可以doc inv,看看具体的说明...
最小二乘残差的投影似乎有matlab函数可直接调用的...
查查先

【 在 nc (nc) 的大作中提到: 】
: 这个问题是我实际需求的简化
: 我的应用中,实际是要求最小二乘法残差的正交投影矩阵
: 即:对多个 m×n 矩阵 X ,分别求 eye(m) - A * inv(A'*A) * A'
: ...................



────────────────────────────────────────
  nc (nc)                          于  (Mon Jul 31 13:04:33 2006)  说道:

谢谢

【 在 hahn (有奇@选择遗忘的自由) 的大作中提到: 】
: 你这个想法非常好,
: 非循环操作是比较省时间
: 我还想不出来怎么具体做,
: ...................



[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.727毫秒