查看: 3845|回复: 3|关注: 0

[已答复] 书140页,sub2ind函数问题

[复制链接]

新手

7 麦片

财富积分


050


3

主题

13

帖子

0

最佳答案
发表于 2016-9-1 16:00:12 | 显示全部楼层 |阅读模式
本帖最后由 2016夏 于 2016-9-1 16:10 编辑

程序代码如下:
  1. function [x,f] = GAforSCADA
  2. S = 50;G = 200;
  3. sp = 1.75;
  4. R = [.91 .92 .91;.90 .94 .92;.92 .91 .90;.93 .90 .93;.90 .91 .91;.92 .92 .93];
  5. c = [40 41 39;65 54 57;60 55 62;64 62 66;68 70 67;48 51 49];
  6. w = [9 8 10;10 10 14;12 11 10;13 10 12;13 12 14;12 14 15];
  7. %向量化的目标函数
  8. ObjectFun = @(m,a) prod(1-(1-R(sub2ind([6,3],repmat(1:6,S,1),a))).^m,2);
复制代码


我在MATLAB中的help文档中查到了sub2ind函数调用格式
linearInd =sub2ind(matrixSize, rowSub, colSub)

a可以看作是列数,但是repmat(1:6,S,1)产生的是一个矩阵,请问此处sub2ind函数如何理解?


另,@(m,a)是什么意思?






回复主题 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


3

主题

13

帖子

0

最佳答案
 楼主| 发表于 2016-9-6 16:59:59 | 显示全部楼层
@(m,a)是使用匿名函数的用法,
ObjectFun = @(m,a) prod(1-(1-R(sub2ind([6,3],repmat(1:6,S,1),a))).^m,2);
@(m,a)定义了一个匿名函数,该函数含有两个输入变量,m和a;
prod(1-(1-R(sub2ind([6,3],repmat(1:6,S,1),a))).^m,2) 为函数体表达式;
回复此楼 已获打赏: 0 积分

举报

新手

7 麦片

财富积分


050


3

主题

13

帖子

0

最佳答案
 楼主| 发表于 2016-9-6 17:14:24 | 显示全部楼层
prod(1-(1-R(sub2ind([6,3],repmat(1:6,S,1),a))).^m,2);
大致意思我理解了一点,prod(...)该括号里面的意思是对一个Sx6的矩阵,各行元素连乘,最后得到一个Sx1的列向量;
通常sub2ind函数是提取一个元素单下标,
此处sub2ind函数相当提取了一个矩阵各元素的单下标,
R(sub2ind([6,3],repmat(1:6,S,1),a)是形成了一个Sx6的矩阵,一行代表了a取某值时6个子系统分别对应的R值。
如果是这样理解的话,后边的.^m幂运算是针对矩阵中的而每个元素而言。
那么R(sub2ind([6,3],repmat(1:6,S,1),a)))相当于还是提取的单个元素?
回复此楼 已获打赏: 0 积分

举报

书籍作者

6 麦片

财富积分



0

主题

40

帖子

0

最佳答案
  • 关注者: 7
发表于 2016-9-10 14:42:24 | 显示全部楼层
2016夏 发表于 2016-9-6 17:14
prod(1-(1-R(sub2ind([6,3],repmat(1:6,S,1),a))).^m,2);
大致意思我理解了一点,prod(...)该括号里面的意 ...

函数sub2ind主要是为了计算矩阵中行列索引对应的线性索引的一种转换关系。对输入的形式可以是矩阵,可以把数值和向量当作是特殊的矩阵形式,唯一需要确定的是行列索引的size是一致的。
然后通过计算出的线性索引找到矩阵R中对应的值,也就是R(linearIndex)的用法。有些时候由于选择的位置特殊,也可以采用R(row1:rowStep:row2,col1:colStep:col2)的方式获得矩阵R中对应位置的值。
两者的区别是,假设row=row1:rowStep:row2,col=col1:colStep:col2,那么选取的R(row,col)中的位置是对集合row和col中各自元素的全排列选取出来。linearIndex = sub2ind(sz,row,col);R(linearIndex)则是将(row,col)看作是一组坐标,所以要求row和col的size相等,只选取坐标对应的值。即R(linearIndex)仅选择row(i),col(i)对应的值,而R(row,col)不仅选取row(i),col(i)的值,还会选取row(i),col(j)对应的值。
举一个例子,如果我们要取一个3x3方阵R中对角线元素的值,应该用
linearIndex = sub2ind([3,3],1:3,1:3);
youWant = R(linearIndex);
而如果采用R(1:3,1:3)得到的则是整个矩阵R
回复此楼 已获打赏: 0 积分

举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表