伊莉討論區

標題: MATLAB與C語言 [打印本頁]

作者: 雷亂圈    時間: 2015-11-21 02:29 PM     標題: MATLAB與C語言

本帖最後由 雷亂圈 於 2015-11-23 12:57 AM 編輯

要將這轉成C語言
但不清楚C語言陣列值不定的情況如何編寫

function [child] =mutation(parent,pm)
stringlength=length(parent(1,: ));
if (rand<pm)
    mpoint=round(rand(1,100)*(stringlength-1))+1;
    child=parent;
    child(:,mpoint)=abs(parent(:,mpoint)-1);
else
    child=parent;
end
end


作者: 雷亂圈    時間: 2015-11-21 10:35 PM

謝謝你的回答
有碰到問題會再詢問您的
作者: 雷亂圈    時間: 2015-11-22 03:12 PM

我在網上參考了許多動態配置的寫法
還是不太清楚撰寫方式
應該說是我不清楚
stringlength=length(parent(1,);
if (rand<pm)
這兩段該如何編寫
作者: snowflying    時間: 2015-11-22 10:55 PM

雷亂圈 發表於 2015-11-22 03:12 PM
我在網上參考了許多動態配置的寫法
還是不太清楚撰寫方式
應該說是我不清楚

parent(1, : )  後面的 : )   被轉成表情符號了
貼上來時留意一下,冒號後面可以加個空格,避免原文被轉換

stringlength 可以藉由多傳一個參數進去,表示第一個參數 (陣列) 裡面有多少個元素
matlab 的 rand 是浮點數,但 C  裡面的 rand() 是整數,所以要自己轉換
而且 C 還要先呼叫 srand()

作者: 雷亂圈    時間: 2015-11-30 12:13 PM

snowflying 發表於 2015-11-22 10:55 PM
parent(1, : )  後面的 : )   被轉成表情符號了
貼上來時留意一下,冒號後面可以加個空格,避免原文被轉 ...

版大不好意思想問一下
程式一開始我能使用int main()來定義嗎

第2個問題C語言的突變是要自己來編寫嗎
作者: snowflying    時間: 2015-11-30 12:16 PM

雷亂圈 發表於 2015-11-30 12:13 PM
版大不好意思想問一下
程式一開始我能使用int main()來定義嗎

應該是寫成一個函式才對
int main() 可以拿來呼叫這個函式,測試是否能產生正確的結果

突變是什麼?
作者: 雷亂圈    時間: 2015-11-30 12:30 PM

snowflying 發表於 2015-11-30 12:16 PM
應該是寫成一個函式才對
int main() 可以拿來呼叫這個函式,測試是否能產生正確的結果

謝謝你的回答
喔原來如此有點錯亂了

function [child] =mutation(parent,pm)這句中的child和parent,pm能使用
double來定義嗎

不好意思版大C語言沒有學得很好所以問了一些奇怪的問題
作者: snowflying    時間: 2015-11-30 01:21 PM

雷亂圈 發表於 2015-11-30 12:30 PM
謝謝你的回答
喔原來如此有點錯亂了

回傳值不會宣告變數,只有型態,函式名稱應該就是 mutation 了
參數 parent 和 pm 可以是 double
作者: 雷亂圈    時間: 2015-12-1 03:15 PM

snowflying 發表於 2015-11-30 01:21 PM
回傳值不會宣告變數,只有型態,函式名稱應該就是 mutation 了
參數 parent 和 pm 可以是 double ...

版大不好意思
我現在卡在不知該如何起頭編寫這篇程式碼下半部的運算部分沒什麼問題了
但上半部還是不知道該如何編寫可以請版大幫個忙嗎


作者: snowflying    時間: 2015-12-2 12:36 AM

雷亂圈 發表於 2015-12-1 03:15 PM
版大不好意思
我現在卡在不知該如何起頭編寫這篇程式碼下半部的運算部分沒什麼問題了
但上半部還是不知道 ...

我怎麼知道下半部和上半部各是哪裡 XD
作者: 雷亂圈    時間: 2015-12-2 10:06 AM

snowflying 發表於 2015-12-2 12:36 AM
我怎麼知道下半部和上半部各是哪裡 XD

不好意思版大
我不懂的部分是
function [child] =mutation(parent,pm)
stringlength=length(parent(1,: ));
這兩段雖然有上網查過但還是不太清楚
作者: snowflying    時間: 2015-12-2 10:34 AM

雷亂圈 發表於 2015-12-2 10:06 AM
不好意思版大
我不懂的部分是
function [child] =mutation(parent,pm)

可是連函式宣告、參數部分都還沒處理完
那底下是怎麼寫的呢?

作者: 雷亂圈    時間: 2015-12-2 10:57 AM

snowflying 發表於 2015-12-2 10:34 AM
可是連函式宣告、參數部分都還沒處理完
那底下是怎麼寫的呢?

版大可能誤會了我的意思是我理解了原程式碼中的運算部分所表達的意思
但就如版大說的我並不知道函式宣告、參數部分編寫方式
所以沒法動手

作者: snowflying    時間: 2015-12-2 01:16 PM

雷亂圈 發表於 2015-12-2 10:57 AM
版大可能誤會了我的意思是我理解了原程式碼中的運算部分所表達的意思
但就如版大說的我並不知道函式宣告 ...

傳進去的陣列會是動態配置而來的嗎?
還是直接是個二維陣列?
兩者做法可能有點不同

作者: 雷亂圈    時間: 2015-12-2 06:36 PM

本帖最後由 snowflying 於 2015-12-2 08:11 PM 編輯
snowflying 發表於 2015-12-2 01:16 PM
傳進去的陣列會是動態配置而來的嗎?
還是直接是個二維陣列?
兩者做法可能有點不同

傳進去的是動態配置而來的

作者: snowflying    時間: 2015-12-3 02:56 AM

雷亂圈 發表於 2015-12-2 06:36 PM
傳進去的是動態配置而來的
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define print printf
  5. #define N 3
  6. #define M 8

  7. void mutation(double **parent , double pm , int n , int m , double ***child)
  8. {
  9.     int i , j;
  10.     double rd;
  11.    
  12.     srand(time(NULL));
  13.     *child = (double**) malloc(sizeof(double**) * n);
  14.    
  15.     for(i = 0 ; i < n ; ++i)
  16.         (*child)[i] = (double*) malloc(sizeof(double) * m);
  17.    
  18.     rd = (double) rand() / RAND_MAX;
  19.    
  20.    
  21.     if(rd < pm)
  22.     {
  23.         int *mpoint = (int*) malloc(sizeof(int) * 100);
  24.         
  25.         for(i = 0 ; i < 100 ; ++i)
  26.             mpoint[i] = (double) rand() / RAND_MAX * (m - 1) + 0.5;

  27.         for(i = 0 ; i < n ; ++i)
  28.             memcpy((*child)[i] , parent[i] , sizeof(double) * m);
  29.             
  30.         for(i = 0 ; i < 100 ; ++i)
  31.             for(j = 0 ; j < n ; ++j)
  32.                 (*child)[j][mpoint[i]] = abs(parent[j][mpoint[i]] - 1);

  33.         free(mpoint);
  34.     }
  35.     else
  36.     {
  37.         for(i = 0 ; i < n ; ++i)
  38.             memcpy((*child)[i] , parent[i] , sizeof(double) * m);
  39.     }
  40. }
  41. int main()
  42. {
  43.     double **parent;
  44.     double **child = NULL;
  45.     double val = 0;
  46.     int i , j;
  47.    
  48.     parent = (double**) malloc(sizeof(double*) * N);
  49.    
  50.     for(i = 0 ; i < N ; ++i)
  51.         parent[i] = (double*) malloc(sizeof(double) * M);

  52.     for(i = 0 ; i < N ; ++i)
  53.         for(j = 0 ; j < M ; ++j)
  54.             parent[i][j] = val++;

  55.     mutation(parent , 0.3 , N , M , &child);
  56.    
  57.     for(i = 0 ; i < N ; ++i)
  58.     {
  59.         for(j = 0 ; j < M ; ++j)
  60.         {
  61.             print("%f " , child[i][j]);
  62.         }
  63.         putchar('\n');
  64.     }
  65.    
  66.     for(i = 0 ; i < N ; ++i)
  67.         free(parent[i]);
  68.         
  69.     free(parent);

  70.     for(i = 0 ; i < N ; ++i)
  71.         free(child[i]);
  72.         
  73.     free(child);
  74.         
  75.     return 0;
  76. }
複製代碼



作者: 雷亂圈    時間: 2015-12-3 11:17 AM

snowflying 發表於 2015-12-3 02:56 AM

版大我將您所打的程式進行運行形成執行檔
但說這一段有錯
srand(time(NULL));


作者: 雷亂圈    時間: 2015-12-3 07:19 PM

雷亂圈 發表於 2015-12-3 11:17 AM
版大我將您所打的程式進行運行形成執行檔
但說這一段有錯
srand(time(NULL));

版大想多問一下當作學習用
假如直接是個二維陣列的話作法是如何
作者: 雷亂圈    時間: 2015-12-3 10:57 PM

function [child1,child2] = crossover(parent1,parent2,pc)
stringlength=length(parent1(1,: ));
    if(rand < pc)
        cpoint =  round(rand*(stringlength-2))+1;
        child1=[parent1(:,1:cpoint) parent2(:,cpoint+1:stringlength)];
        child2=[parent2(:,1:cpoint) parent1(:,cpoint+1:stringlength)];
    else
    child1=parent1;
    child2=parent2;
    end
end

版大我想問一下如這題
child,parent有2個情況下n和m這兩個變數是否需要增加
作者: snowflying    時間: 2015-12-4 12:52 AM

雷亂圈 發表於 2015-12-3 10:57 PM
function [child1,child2] = crossover(parent1,parent2,pc)
stringlength=length(parent1(1,: ));
    if( ...

如果  parent1 和 parent2 維度一樣
那麼共用同樣的 n、m 就行了

作者: 雷亂圈    時間: 2015-12-4 03:11 PM

snowflying 發表於 2015-12-4 12:52 AM
如果  parent1 和 parent2 維度一樣
那麼共用同樣的 n、m 就行了

版大請問一下這兩段該如何編寫
cpoint =  round(rand*(stringlength-2))+1;
child1=[parent1(:,1:cpoint) parent2(:,cpoint+1:stringlength)];

作者: 雷亂圈    時間: 2015-12-16 11:09 PM

版大
這兩段我翻書找資料幾天了但還是無法編寫出來請版大在幫一次忙吧
cpoint =  round(rand*(stringlength-2))+1;
child1=[parent1(:,1:cpoint) parent2(:,cpoint+1:stringlength)];
作者: 雷亂圈    時間: 2015-12-17 11:05 PM

謝謝版大的回答我在研究一下




歡迎光臨 伊莉討論區 (http://www.web01.eyny.com/) Powered by Discuz!