为什么使用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]不一样
/* 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) 我正在寻找最有效的IDL代码来替换IDL矩阵乘(#)运算符,用于特定的,对角线(非对角线或对角线)矩阵,具有3个不同的值:对角线上的单位; 统一加上对角线右边的三角形; 统一减去左边相同的delta.
IDL(已修复;不可协商;对不起); 快门式CCD成像系统上的图像模糊.
一个1024x1024的矩阵,"EMatrix",对角线上有一个整体; 对角线左边的(1-delta); (1 + delta)向右; delta = 0.044.
另一个1024x1024矩阵,Image
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