小编Bri*_*ich的帖子

为什么在转换const双索引参数时会得到-Wincompatible-pointer-types警告

为什么使用gcc5(5.3.0)编译下面的最小测试用例C代码会对带有const参数的warning()函数调用生成[-Wincompatible-pointer-types]警告,并使用ConstMyDouble typedef强制转换该参数,但是不是对于不使用ConstMyDouble转换的nowarning()调用,也不是对使用非const typedef MyDouble的noconst()调用,以及如何修复它?

当在constdef中使用[const]并且使用typedef将参数强制转换为函数时,似乎有一种微妙之处.

最令人困惑的部分是警告信息:

minimal.c:17:7: note: expected ‘const double (*)[2]’ but argument is
  of type ‘const ConstMyDouble (*)[2] {aka const double (*)[2]}’
Run Code Online (Sandbox Code Playgroud)

这似乎是说const double(*)[2]与(又名)const double(*)[2]不一样

最小的C代码测试用例

/* Usage:
 *
 *   ./minimal ; echo ${PIPESTATUS[0]}
 *     => echo command will output 99 (BASH)
 *
 * Compile and link, default:
 *
 *   gcc5 minimal.c -o minimal
 *     => Casts argument to minimal to [ConstMyDouble], a typedef
 *     => Generates [-Wincompatible-pointer-types] warnings
 *
 */
typedef       double      MyDouble;
typedef …
Run Code Online (Sandbox Code Playgroud)

c compilation compiler-warnings

9
推荐指数
1
解决办法
104
查看次数

如何在使用对角线(非对角线)矩阵的IDL中最佳地优化矩阵乘法

我正在寻找最有效的IDL代码来替换IDL矩阵乘(#)运算符,用于特定的,对角线(非对角线或对角线)矩阵,具有3个不同的值:对角线上的单位; 统一加上对角线右边的三角形; 统一减去左边相同的delta.

问题域

IDL(已修复;不可协商;对不起); 快门式CCD成像系统上的图像模糊.

基本问题陈述

特定

  • 一个1024x1024的矩阵,"EMatrix",对角线上有一个整体; 对角线左边的(1-delta); (1 + delta)向右; delta = 0.044.

  • 另一个1024x1024矩阵,Image

询问

  • 什么是最快的IDL代码(Image#EMatrix)?

2014-09-16:请参阅下面的更新

背景

更大的问题陈述(其中矩阵乘法似乎只是最慢的部分,优化整个例程不会受到影响):

第9.3.1.2节(PDF第47页;内部页面34)和同一目录中的其他文件(抱歉作为新手我只能发布两个链接)

到目前为止我的工作

现在(2014-09-26)比1024x1024矩阵的IDL#运算符快一个数量级.

细节

天真的操作是O(n ^ 3)并执行大约十亿(2 ^ 30)双精度乘法和大约相同数量的加法; 维基百科进一步告诉我,斯特拉森的算法将其降低到O(n ^ 2.807),或者约为282M +,n = 1024.

对于一个简单的3x3案例进行细分,比如图像和EMatrix

   image        EMatrix

[ 0  1  2 ]   [ 1  p  p ]
[ 3  4  5 ] # [ m  1  p ]
[ 6  7  8 ]   [ m  m  1 ]
Run Code Online (Sandbox Code Playgroud)

其中p代表1 + delta(1.044),m代表1-delta(0.956).

由于m和p的重复,应该有一个简化:查看图像的中间列,三行的结果应该是

[1,4,7] . [1,p,p] …
Run Code Online (Sandbox Code Playgroud)

algorithm optimization idl-programming-language matrix-multiplication

5
推荐指数
1
解决办法
470
查看次数