24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2285  |  回复: 8

我是柱哥啊

金虫 (正式写手)

[求助] 如何按照矩阵的某一行进行随机排列已有2人参与

1、给定矩阵,如何随机排列第一行,并且矩阵的每一列对应不变?换句话就是,对矩阵进行随机重排列序,
2、给定矩阵每一行的意义,例如:第一行是工件号,第二行是对应工件的加工时间,第三行是对应工件的尺寸。
针对第一行进行遗传算子的一系列操作,在这个过程中,需要用加工时间与尺寸进行计算。
如何抽出矩阵的第一行进行其他的操作?操作结果形成新的工件号排序,并且工件对应的属性不变。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

JustDoIt!
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

asmeng

金虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
我是柱哥啊: 金币+20, ★★★很有帮助 2014-04-25 11:44:02
1. 第一个问题是不是对矩阵根据第一行进行随机排列?
实际上是各列进行洗牌。用Matlab来做的话,可以用randperm函数。比如,x是三行4列的矩阵,然后按列洗牌:
x=[1,2,3,4;1,2,3,4;1,2,3,4]
ind = randperm(4) %随机排列1到4
y=x(:,ind)%按照ind排列矩阵的各列

2. 第二个问题是不是先取出第一行进行操作,取出矩阵第一行的命令是:x1=x(1,,然后对x1进行运算,生成一个新的序号?(类似于1问中有一个新的ind),然后排列矩阵x吗?

» 本帖已获得的红花(最新10朵)

2楼2014-04-24 22:21:50
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖


感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢参与 2014-04-27 08:19:48
你只需要将排序后的第一行作为列号指定即可
试试下面的代码,可能更好理解一些
CODE:
a = [rand(1,5);randi(10,1,5);randi(100,1,5)]
b = a(:,randperm(length(a(1,:)),length(a(1,:))))

1.随机排列第一行用randperm(n,n),其中n==第一行的长度,这样不管矩阵维数是多少,生成的结果都不会出问题

2.跟第一个问题一样,第一行是a(1,,操作完后将这个作为列号指定抽取组成新矩阵就行.
例如下面的代码,a = [1,2,3;4,5,6]; b是a的第一行重新排[3,1,2],c是重排后对应的新矩阵
CODE:
>> a = [1:3;4:6]

a =

     1     2     3
     4     5     6

>> b = [3,1,2]

b =

     3     1     2

>> c = a(:,b)

c =

     3     1     2
     6     4     5

» 本帖已获得的红花(最新10朵)

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2014-04-24 23:23:35
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

我是柱哥啊

金虫 (正式写手)

送红花一朵
引用回帖:
2楼: Originally posted by asmeng at 2014-04-24 22:21:50
1. 第一个问题是不是对矩阵根据第一行进行随机排列?
实际上是各列进行洗牌。用Matlab来做的话,可以用randperm函数。比如,x是三行4列的矩阵,然后按列洗牌:
x=
ind = randperm(4) %随机排列1到4
y=x(:,ind)% ...

第二个问题就是你说的这样子,跟第一个类似,这是在编码中遇到的坎,其实我想再仔细描述下,但是那就又牵扯到遗传算法了,只好这样子
JustDoIt!
4楼2014-04-25 11:05:41
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

我是柱哥啊

金虫 (正式写手)

引用回帖:
2楼: Originally posted by asmeng at 2014-04-24 22:21:50
1. 第一个问题是不是对矩阵根据第一行进行随机排列?
实际上是各列进行洗牌。用Matlab来做的话,可以用randperm函数。比如,x是三行4列的矩阵,然后按列洗牌:
x=
ind = randperm(4) %随机排列1到4
y=x(:,ind)% ...

抽出第一行,是作为序列号来用的,因为最终是根据第二行第三行的值来计算目标,最终根据目标来重新排列序列号。
遗传算法过程,我的是对序列号进行重组交叉等一些列操作,也就是说操作对象是序列号,但是计算目标的时候是根据序列号对应的第二行第三行来得,所以怎么才能保证每个号码对应的二三行值不会混乱?
JustDoIt!
5楼2014-04-25 11:14:15
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

我是柱哥啊

金虫 (正式写手)

送红花一朵
引用回帖:
3楼: Originally posted by libralibra at 2014-04-24 23:23:35
你只需要将排序后的第一行作为列号指定即可
试试下面的代码,可能更好理解一些
a =
b = a(:,randperm(length(a(1,),length(a(1,)))

1.随机排列第一行用randperm(n,n),其中n==第一行的长度,这样不管矩阵维 ...

randi()这个命令我的matlab里边没有,能不能把你的程序文件里的randi.m文件复制我一份?
JustDoIt!
6楼2014-04-25 11:25:16
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

asmeng

金虫 (正式写手)

引用回帖:
5楼: Originally posted by 我是柱哥啊 at 2014-04-25 11:14:15
抽出第一行,是作为序列号来用的,因为最终是根据第二行第三行的值来计算目标,最终根据目标来重新排列序列号。
遗传算法过程,我的是对序列号进行重组交叉等一些列操作,也就是说操作对象是序列号,但是计算目标 ...

只要保证列标号不变就没有问题。比如对矩阵的第二行进行操作,结果记为矩阵y,y(2,i) = f(x(1,i)),即利用x的第一行的各列来计算y的第二行的各列。其中f(x(1,i))是你利用第一行的序号来进行操作的算法函数。
7楼2014-04-25 11:27:07
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

我是柱哥啊

金虫 (正式写手)

引用回帖:
3楼: Originally posted by libralibra at 2014-04-24 23:23:35
你只需要将排序后的第一行作为列号指定即可
试试下面的代码,可能更好理解一些
a =
b = a(:,randperm(length(a(1,),length(a(1,)))

1.随机排列第一行用randperm(n,n),其中n==第一行的长度,这样不管矩阵维 ...

我的matlab中randperm(n)可以显示结果,但是randperm(m,n)显示不来。所以想问下,rangdperm(m,n)这个命令是什么含义?
JustDoIt!
8楼2014-04-25 11:39:14
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

引用回帖:
8楼: Originally posted by 我是柱哥啊 at 2014-04-25 11:39:14
我的matlab中randperm(n)可以显示结果,但是randperm(m,n)显示不来。所以想问下,rangdperm(m,n)这个命令是什么含义?...

randperm(n,n)与randperm(n)的效果是一样的
randi()是内置函数,为了测试方法的,随机生成一些整数,这个跟你的代码应该没有关系
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
9楼2014-04-25 15:39:19
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 我是柱哥啊 的主题更新
信息提示
请填处理意见