楼主: mengqinqing
6988 15

[问答] 求助:用R怎么产生Hadamard矩阵,有c语言程序,改编 [推广有奖]

11
mengqinqing 发表于 2012-4-16 22:02:48
epoh 发表于 2012-4-16 15:09
%H=hadamard(n),  H'*H = N*EYE(N).

%%%%in Matlab
谢谢!
不过有一个问题,这两个软件输出的矩阵要求n是2的幂,可是我用c语言程序却可以得到比如n=15时的hadamard矩阵。
R
>  n=15
>  2*hadamard(n-4)-1
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    1    1    1    1    1    1    1    1     1     1     1
[2,]    1   -1   -1    1   -1   -1   -1    1    1     1    -1     1
[3,]    1   -1    1   -1   -1   -1    1    1    1    -1     1    -1
[4,]    1    1   -1   -1   -1    1    1    1   -1     1    -1    -1
[5,]    1   -1   -1   -1    1    1    1   -1    1    -1    -1     1
[6,]    1   -1   -1    1    1    1   -1    1   -1    -1     1    -1
[7,]    1   -1    1    1    1   -1    1   -1   -1     1    -1    -1
[8,]    1    1    1    1   -1    1   -1   -1    1    -1    -1    -1
[9,]    1    1    1   -1    1   -1   -1    1   -1    -1    -1     1
[10,]    1    1   -1    1   -1   -1    1   -1   -1    -1     1     1
[11,]    1   -1    1   -1   -1    1   -1   -1   -1     1     1     1
[12,]    1    1   -1   -1    1   -1   -1   -1    1     1     1    -1

C
1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
1  -1  1  -1  1  -1  1  -1  1  -1  1  -1  1  -1  1
1  1  -1  -1  1  1  -1  -1  1  1  -1  -1  1  1  -1
1  -1  -1  1  1  -1  -1  1  1  -1  -1  1  1  -1  -1
1  1  1  1  -1  -1  -1  -1  1  1  1  1  -1  -1  -1
1  -1  1  -1  -1  1  -1  1  1  -1  1  -1  -1  1  -1
1  1  -1  -1  -1  -1  1  1  1  1  -1  -1  -1  -1  1
1  -1  -1  1  -1  1  1  -1  1  -1  -1  1  -1  1  1
1  1  1  1  1  1  1  1  -1  -1  -1  -1  -1  -1  -1
1  -1  1  -1  1  -1  1  -1  -1  1  -1  1  -1  1  -1
1  1  -1  -1  1  1  -1  -1  -1  -1  1  1  -1  -1  1
1  -1  -1  1  1  -1  -1  1  -1  1  1  -1  -1  1  1
1  1  1  1  -1  -1  -1  -1  -1  -1  -1  -1  1  1  1
1  -1  1  -1  -1  1  -1  1  -1  1  -1  1  1  -1  1
1  1  -1  -1  -1  -1  1  1  -1  -1  1  1  1  1  -1
不知道是怎么回事?
用自己的力量站在自己的位置

12
epoh 发表于 2013-1-23 18:37:30
mengqinqing 发表于 2012-4-16 22:02
谢谢!
不过有一个问题,这两个软件输出的矩阵要求n是2的幂,可是我用c语言程序却可以得到比如n=15时的h ...
请你确认,你的程序用C++使用hadamard(8)的结果
是(同MATLAB)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    1    1    1    1
[2,]    1   -1    1   -1    1   -1    1   -1
[3,]    1    1   -1   -1    1    1   -1   -1
[4,]    1   -1   -1    1    1   -1   -1    1
[5,]    1    1    1    1   -1   -1   -1   -1
[6,]    1   -1    1   -1   -1    1   -1    1
[7,]    1    1   -1   -1   -1   -1    1    1
[8,]    1   -1   -1    1   -1    1    1   -1

还是
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    1    1    1    1
[2,]    1   -1   -1    1   -1   -1   -1    1
[3,]    1   -1    1   -1   -1   -1    1    1
[4,]    1    1   -1   -1   -1    1    1    1
[5,]    1   -1   -1   -1    1    1    1   -1
[6,]    1   -1   -1    1    1    1   -1    1
[7,]    1   -1    1    1    1   -1    1   -1
[8,]    1    1    1    1   -1    1   -1   -1

13
ntsean 发表于 2013-1-23 22:56:53
这个用回归就可以了

hadamard <- function(n) {
        if (n==2) return(matrix(c(1, -1, 1, 1), nrow = 2))
        h <- matrix(NA, nrow=n, ncol=n)
        n1 <- n/2
        h[1:n1, 1:n1] <- h[(n1+1):n, (n1+1):n] <- h[1:n1, (n1+1):n] <- hadamard(n1)
        h[(n1+1):n, 1:n1] <- -hadamard(n1)
        return(h)
}


> hadamard(4)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]   -1    1   -1    1
[3,]   -1   -1    1    1
[4,]    1   -1   -1    1
> hadamard(8)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    1    1    1    1
[2,]   -1    1   -1    1   -1    1   -1    1
[3,]   -1   -1    1    1   -1   -1    1    1
[4,]    1   -1   -1    1    1   -1   -1    1
[5,]   -1   -1   -1   -1    1    1    1    1
[6,]    1   -1    1   -1   -1    1   -1    1
[7,]    1    1   -1   -1   -1   -1    1    1
[8,]   -1    1    1   -1    1   -1   -1    1

14
ntsean 发表于 2013-1-23 23:16:06
或者,如果和上面用一样定义的hadamard的话


hadamard <- function(n) {
  if (n==2) return(matrix(c(1, 1, 1, -1), nrow = 2))
  h <- matrix(NA, nrow=n, ncol=n)
  n1 <- n/2
  h[1:n1, 1:n1] <- h[(n1+1):n, 1:n1]  <- h[1:n1, (n1+1):n] <- hadamard(n1)
  h[(n1+1):n, (n1+1):n] <- -hadamard(n1)
  return(h)
}

> hadamard(8)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    1    1    1    1
[2,]    1   -1    1   -1    1   -1    1   -1
[3,]    1    1   -1   -1    1    1   -1   -1
[4,]    1   -1   -1    1    1   -1   -1    1
[5,]    1    1    1    1   -1   -1   -1   -1
[6,]    1   -1    1   -1   -1    1   -1    1
[7,]    1    1   -1   -1   -1   -1    1    1
[8,]    1   -1   -1    1   -1    1    1   -1

15
woai_dada 发表于 2013-4-2 18:33:07
楼主你好!请问你在一楼写的是产生hadamard矩阵的C语言代码吗?我做实验想要借鉴一下,可是有些地方看不太懂。。。能帮个忙解释一下吗?先谢谢了。

16
mengqinqing 发表于 2013-4-3 09:12:30
woai_dada 发表于 2013-4-2 18:33
楼主你好!请问你在一楼写的是产生hadamard矩阵的C语言代码吗?我做实验想要借鉴一下,可是有些地方看不太懂 ...
我也不太懂,所以就用R了
用自己的力量站在自己的位置

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 13:58