这个提交定义一个类为代表的产品矩阵(或知道如何用)的任何对象时更高效的存储和操纵矩阵分别。s manbetx 845
用法:
P = ProdCascade ({A1, A2,…,一个})
这将创建一个对象P代表矩阵产品A1 * A2 *…*。然而,在内部对象存储/操纵矩阵{A1, A2,……单独,},可以更有效的memory-wise比当产品完全评估。此外,在评估一个矩阵向量乘积A1 * A2 *……* * x,它可以更有效的速度明智利用结合性和计算结果使用连续n产品。s manbetx 845
这个想法的一个简单的例子是外产品u * v。的列向量u和v .显然,更有效率,它用向量的外积x u * (v。”* x)比(u * v。) * x。下面给出了一个示范类正好利用了这一点。
u =兰德(4000 1);
v =兰德(4000 1);
x =兰德(4000 1);
Pmat = u * v。”;
P = ProdCascade ({u, v。});
抽搐
日元= Pmat * x;
z1 = Pmat。*日元;
toc;
%运行时间是0.050854秒。
抽搐
y2 = P * x;
z2 = P。' * y2;
toc
%运行时间是0.000457秒。
PercentError = 100 *规范([y2; z2] - [y1; z1]) /规范((y1; z1)), % = 7.8336 e - 014
> >谁Pmat P
类属性名称大小字节
4000页64244 ProdCascade x4000
Pmat 4000 x4000 128000000双
其他情况最好可以存储一个矩阵分解为一个产品将包括,例如,当一个大矩阵稀疏分解。
方法重载的类包括mtimes(*),转置(。),ctranpose(),精细,和发票,利用这些操作或多或少地分布在矩阵乘法。s manbetx 845此外,一些方法使对象P被操纵,就好像它是细胞数组{A1,…},最初生成的对象。例如,表达式A1 = P{1}将提取第一个操作数的产品。
ProdCascade类不仅可以是有用的对持有的产品矩阵,也知道如何用的任何操作对象。s manbetx 845这是一个例子,它使用我MatrixObj类
//www.tianjin-qmedu.com/matlabcentral/fileexchange/26611-on-the-fly-definition-of-custom-matrix-objects
频域滤波操作表示为一个乘法ProdCascade对象,P。
% %数据
N = 2 ^ 14;
x =兰德(N, 1);
低通滤波器= 1 (N, 1);低通滤波器(10:end-9) = 0;
% %进行FFT运算符
Q = MatrixObj;
Q.Ops.mtimes = @ (Q, x) fft (x);
Q.Trans.mtimes = @ (Q, x)传输线(x);
% %使滤波算子,P * x应该相当于传输线(fft (x) *低通)
L = spdiags(低通0 speye (N));
P = ProdCascade ({Q’, L Q});
isequal (P * x,传输线(fft (x) *低通)% = 1
DISCAIMER:错误检查是从未做过ProdCascade的运营商是否兼容连续乘法。
引用作为
马特·J (2023)。矩阵乘积表示的s manbetx 845个人操作数(//www.tianjin-qmedu.com/matlabcentral/fileexchange/29498-matrix-s manbetx 845products-expressed-in-terms-of-individual-operands), MATLAB中央文件交换。检索。