c – 转置2D阵列

c – 转置2D阵列,第1张

概述你如何有效地转置矩阵?有没有这个库,或者你会使用什么算法? 例如.: short src[W*H] = { {1,2,3}, {4,5,6}};short dest[W*H];rotate_90_clockwise(dest,src,W,H); //<-- magic in here, no need for in-place//dest is now:{ {4, 1 你如何有效地转置矩阵?有没有这个库,或者你会使用什么算法?

例如.:

short src[W*H] = {  {1,2,3},{4,5,6}};short dest[W*H];rotate_90_clockwise(dest,src,W,H); //<-- magic in here,no need for in-place//dest is Now:{  {4,1},{5,2},{6,3}};

(在我的具体情况下,它的src数组是原始图像数据,目标是帧缓冲,我在ARM上嵌入了不支持汇编的工具链)

解决方法 在某些情况下,有这样的库.而且,值得注意的是,您可以使用矢量化数据(例如,128位向量中的四个32位元素,但这也适用于32位寄存器中的四个8位字节),以便比单个数据更快 – 元素访问.

对于转置,标准的想法是使用“shuffle”指令,它允许您以任何顺序从两个现有向量中创建新的数据向量.您使用输入数组的4×4块.所以,从开始,你有:

v0 = 1 2 3 4v1 = 5 6 7 8v2 = 9 A B Cv3 = D E F 0

然后,您将shuffle指令应用于前两个向量(交错其奇数元素,A0B0 C0D0 – > ABCD,并交叉它们的偶数元素,0A0B 0C0D – > ABCD),并将其应用于最后两个,以创建一个新的转换每个2×2块的向量:

1 5 3 72 6 4 89 D B FA E C 0

最后,您将shuffle指令应用于奇数对和偶数对(组合它们的第一对元素,AB00 CD00 – > ABCD,以及它们的最后一对,00AB 00CD – > ABCD),以获得:

1 5 9 D2 6 A E3 7 B F4 8 C 0

在那里,16个元素转换为8个指令!

现在,对于32位寄存器中的8位字节,ARM没有完全随机指令,但您可以使用移位和SEL(选择)指令来合成所需的内容,并且可以在一个指令中进行第二组混洗.使用PKHBT(打包半字底部顶部)和PKHTB(打包半字顶部底部)指令进行指导.

最后,如果您正在使用具有NEON矢量化的大型ARM处理器,则可以使用16×16块上的16个元素向量执行此类 *** 作.

总结

以上是内存溢出为你收集整理的c – 转置2D阵列全部内容,希望文章能够帮你解决c – 转置2D阵列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存