执行mldivide之间3 x3矩阵M和GPU的每个RGB像素的图像

5视图(30天)
我有一个rgb图像(2048 x2048x3),和我来执行 mldivide每个rgb(3,1)像素M矩阵(3 x3)。
所以每个像素将M \像素操作。最简单的方法是使用两个for循环在每个像素。但是,我想知道如果我可以使用arrayfun或pagefun所以我可以使用GPU。
现在为了使用arrayfun,我不得不硬编码mldivide M变成9 x4194304(2048 * 2048)数组需要很多vram。我想知道如果有一种方法我可以运行这个没有大M gpu数组作为输入。
3评论
Stephen23”class=
Stephen23 2022年7月8日
“对不起,我犯了一个错误,它将一个3 x1矩阵,兰德(3,1)。我忘了matlab y、x大会。”
…我猜你的意思 所有的数学 有约定: https://en.wikipedia.org/wiki/Matrix_(数学)

登录置评。

接受的答案

Stephen23”class=
Stephen23 2022年7月8日
格式紧凑的
S = 5;
M =兰德(3,3);
我=兰德(S, S, 3);
%的参考:
一个=南(S, S, 3);
2 = 1:S
jj = 1: S
像素=重塑(我(ii, jj:), 3, 1);
(二世,jj:) = M \像素;
结束
结束
一个
一个=
(::1)= 4.2226 15.3976 9.7294 0.6686 -8.5764 15.5251 -0.8818 3.5689 4.1730 2.4676 7.1266 -6.9632 9.8103 10.5705 15.3470 7.5849 0.9940 16.1186 -0.2064 16.8039 -7.8875 -7.1051 0.2250 2.7415 -7.6742 (:,:2)= 0.7674 3.0061 1.4504 1.4626 0.3589 2.4699 2.0878 2.4253 1.5477 2.3345 1.0364 0.5316 1.4698 2.3068 2.5930 1.5519 2.5403 3.6515 1.6914 2.3027 0.6423 0.3699 1.7695 2.2491 0.0037 (:,:,3)= -1.0156 -6.3149 -3.2293 -0.7714 2.6126 -5.7948 -0.6883 -2.1061 -2.1869 -1.4797 -2.2634 1.9633 -3.2872 -4.0813 -5.4468 -2.4617 -1.5182 -6.7929 -0.7229 -5.7964 2.5722 2.1096 -1.0220 -1.5365 2.8622
记住,重塑是一个非常快的操作(它不会改变你的数据在内存中,只有头的形状的元数据)。相比之下你想避免操作,重新排列你的数据在内存中(例如转置,PEMUTE)。注意,使用PAGEFUN需要permutimh您的数据。
%重塑()和()和转置MLDIVIDE ():
B =重塑((M \重塑(我*年代3)。”)。”年代,年代,3)
B =
B (:: 1) = 4.2226 15.3976 9.7294 0.6686 -8.5764 15.5251 -0.8818 3.5689 4.1730 2.4676 7.1266 -6.9632 9.8103 10.5705 15.3470 7.5849 0.9940 16.1186 -0.2064 16.8039 -7.8875 -7.1051 0.2250 2.7415 -7.6742 B (:,: 2) = 0.7674 3.0061 1.4504 1.4626 0.3589 2.4699 2.0878 2.4253 1.5477 2.3345 1.0364 0.5316 1.4698 2.3068 2.5930 1.5519 2.5403 3.6515 1.6914 2.3027 0.6423 0.3699 1.7695 2.2491 0.0037 B (:,:, 3) = -1.0156 -6.3149 -3.2293 -0.7714 2.6126 -5.7948 -0.6883 -2.1061 -2.1869 -1.4797 -2.2634 1.9633 -3.2872 -4.0813 -5.4468 -2.4617 -1.5182 -6.7929 -0.7229 -5.7964 2.5722 2.1096 -1.0220 -1.5365 2.8622
%我们可以简化上面的重塑()和MRDIVIDE ():
C =重塑(重塑(*年代,3)/ M。”), S, S, 3)%推荐
C =
C(:: 1) = 4.2226 15.3976 9.7294 0.6686 -8.5764 15.5251 -0.8818 3.5689 4.1730 2.4676 7.1266 -6.9632 9.8103 10.5705 15.3470 7.5849 0.9940 16.1186 -0.2064 16.8039 -7.8875 -7.1051 0.2250 2.7415 -7.6742摄氏度(:,:2)= 0.7674 3.0061 1.4504 1.4626 0.3589 2.4699 2.0878 2.4253 1.5477 2.3345 1.0364 0.5316 1.4698 2.3068 2.5930 1.5519 2.5403 3.6515 1.6914 2.3027 0.6423 0.3699 1.7695 2.2491 0.0037摄氏度(:,:,3)= -1.0156 -6.3149 -3.2293 -0.7714 2.6126 -5.7948 -0.6883 -2.1061 -2.1869 -1.4797 -2.2634 1.9633 -3.2872 -4.0813 -5.4468 -2.4617 -1.5182 -6.7929 -0.7229 -5.7964 2.5722 2.1096 -1.0220 -1.5365 2.8622

更多的答案(2)

神骑士”class=
神骑士 2022年7月9日
编辑:神骑士 2022年7月10日
我感觉我丢失的东西——这是一个反斜杠和多个右手边,或避免排列单个mrdivide(编辑:你仍然需要转置 ,但很快):
[h, w] =大小(im, [1 - 2]);
imout =重塑(重塑(im, [], 3) / (M。”), h, w, 3);
23日评论
保罗”class=
保罗 2022年7月12日
不用担心。我只是删除我的评论,标记你的编辑和它看起来像Stephen23删除了相关评论。如果你删除 你的评论 可以删除这个评论,我们将回到一个不错的,干净的线程好像从未发生过。

登录置评。


类别

找到更多的在数学帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的