استفسار حول آلية التعامل مع مصفوفة من نوع cell

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم ورحمة الله وبركاته

الصورة المرفقة عبارة عن مصفوفة من نوع cell


ولنفرض ان عندي متغير enc=[55,69,80

السؤال كيقية عمل لوب بحيث اذا تشابه الرقم الموجود في الصف الثاني من الصورة المرفقة مع الرقم الموجود في enc ياتي بالحرف المقابل ويخزنه في متغير على شكل حرف.

ولكم جزيل الشكر
 

المرفقات

  • matrix.jpg
    matrix.jpg
    56.4 KB · المشاهدات: 13
التعديل الأخير:

الكوكب

عضو
إنضم
24 فبراير 2010
المشاركات
233
مجموع الإعجابات
3
النقاط
18
I have no big idea about this subject but i think you have to use the command char in matlab which convert digits to characters. you can find in the file the correspondance between them for ascii code used also in matlab. good luck
 

المرفقات

  • Matlab_ASCII_Codes.pdf
    85.1 KB · المشاهدات: 272

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
Thank you brother

I know that, but my question is about how to convert Variable of the type of cells

thank you again
 

الكوكب

عضو
إنضم
24 فبراير 2010
المشاركات
233
مجموع الإعجابات
3
النقاط
18
May be you have to try the commands num2cell, mat2cell or cell2mat Am not sure
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
مشكور أخي بعض الاوامر فعالة

لدي سؤال

لدي رقم 2574 باقي قسمته على 98 هو 26
المطلوب هو المسار بالعكس من الرقم 26 نحصل على 2574 بصراحة أنا مش عارف اذا كان السؤال ممكن ام لا

يعني عمل معكوس باقي القسمة inverse mod

ولكم جزيل الشكر
 

ahmedmecha

عضو جديد
إنضم
20 أكتوبر 2006
المشاركات
365
مجموع الإعجابات
9
النقاط
0
cell variable
-----------------
كود:
A = {[COLOR=Purple]'ab'[/COLOR], [COLOR=Purple]'23'[/COLOR], [COLOR=Purple]'AB'[/COLOR], [COLOR=Purple]'10'[/COLOR]}; [COLOR=Green]% cell array[/COLOR]
A(1,1) [COLOR=Green]% gives ab (type:cell)[/COLOR]
A{1,1} [COLOR=Green]% gives ab (type:char)[/COLOR]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

For mod function, I do not think you could get answer.. from the definition of the function in MATLAB you get the following:

mod(x,y) = x-n*y ------(1)
n = floor(x,y), it is the largest integer number satisfying this equation
x>= n*y -----(2)
from (1) and (2) you can form the following
x - mod(y,x) - floor(x,y)*y = 0 ------(3)

If you solve (3) in MATLAB you get trivial solution, i.e. zero!
If there is anyway to solve (3) for non-trivial solution, you would get the answer

 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم

شكرا لكل من شارك
بشكل خاص انا كنت منتظر مشاركة الأخ ahmedmecha فهو يمتلك خبرة كبير في الماتلاب ربنا يزيده علم.

أخي الكريم لدي سؤال في المرفقات أتمني أن اجد الحل لديك

ربنا يجزيكم الخير
وشكرا
 

المرفقات

  • new2.rar
    6.3 KB · المشاهدات: 10

ahmedmecha

عضو جديد
إنضم
20 أكتوبر 2006
المشاركات
365
مجموع الإعجابات
9
النقاط
0
لا شكر على واجــب

بالنسبة للجزء الأول من السؤال وهو كيف تحصل على المتجه Y من المتجه X ... لا أعتقد أنه بسيط كما تتصور!
كود:
clear [COLOR=Purple]all[/COLOR]
clc
X = [2574 384 72 3];
iy = 1; [COLOR=Green]% index for Y[/COLOR]
iz = length(X); [COLOR=Green]% length of X[/COLOR]
[COLOR=Blue]for [/COLOR]j = 1:iz
    V = X(j);
    n = floor(log10(V)); [COLOR=Green]% no. of digits - 1[/COLOR]
    ix = logspace(0,n,n+1); [COLOR=Green]% ix = 1 10 100 1000 ...[/COLOR]
    m = n+1; [COLOR=Green]% no. of digits of V[/COLOR]
    [COLOR=Blue]for [/COLOR]i = 1:m
        d(i) = floor(V/ix(m+1-i));
        k = i;
        r = 3;
        su = 0;
        [COLOR=Blue]while [/COLOR](k>1)
            su = su - d(k-1)*ix(r-1);
            k = k-1;
            r = r+1;
        [COLOR=Blue]end[/COLOR]
        d(i) = d(i)+su;
    [COLOR=Blue]end[/COLOR]
    [COLOR=Blue]for [/COLOR]i = 1:m
        Y{iy} = d(i); [COLOR=Green]% Y is cell variable[/COLOR]
        iy = iy+1;
    [COLOR=Blue]end[/COLOR]
    [COLOR=Blue]if [/COLOR]j ~= iz
        Y{iy} = [COLOR=Purple]'@'[/COLOR];
        iy = iy+1;
    [COLOR=Blue]end[/COLOR]
[COLOR=Blue]end[/COLOR]
الجزء المهم من الكود هو كيفية الحصول على الأرقام digits المكونة لرقم معين >> إذا كنت تريد إستخدام الكود فأنصحك بكتابة function مستقلة حتى يصبح الكود مفهوم ...
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم ورحمة الله

يأخي مبدع
انا كنت أعلم ان الكود ليس سهل لكن كنت متأكد ان الحل عندك أتمنالك التوفيق .
اتمنى حل الشق الثاني من السؤال

بجد تشكر أخي الكريم
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم ورحمة الله

هذه محاولة لحل الشق الثاني من السؤال ولكن تحتاج لبعض التعديلات أتمنى المساعدة

ولكم جزيل الشكر​
 

المرفقات

  • dell21.rar
    407 بايت · المشاهدات: 9

ahmedmecha

عضو جديد
إنضم
20 أكتوبر 2006
المشاركات
365
مجموع الإعجابات
9
النقاط
0
الجزء الأول من السؤال ..
كود:
clear [COLOR=Purple]all[/COLOR]
clc
Y = {2 6 7 4 [COLOR=Purple]'@'[/COLOR] 3 5 4 [COLOR=Purple]'@' [/COLOR]7 6 [COLOR=Purple]'@' [/COLOR]4}; [COLOR=Green]% supposed i/p vector[/COLOR]
A = {[COLOR=Purple]'a' 'b' 'c' 'd' 'e' 'f' 'g'[/COLOR]; 2 3 4 5 7 8 9}; [COLOR=Green]% encryption table[/COLOR]
YEncry = cell(1,length(Y)); [COLOR=Green]% o/p vector[/COLOR]
[COLOR=Blue]for [/COLOR]i =1:length(Y)
    [COLOR=Blue]for [/COLOR]j = 1:length(A(2,:))
        [COLOR=Blue]if [/COLOR]Y{i} == A{2,j}
            YEncry(i) = A(1,j); [COLOR=Green]% take the letter above the adjacent number[/COLOR]
            [COLOR=Blue]break[/COLOR]
         [COLOR=Blue]elseif [/COLOR]Y{i} == [COLOR=Purple]'@'[/COLOR] [COLOR=Green]% OR Y(i) == {'@'}[/COLOR]
            YEncry(i) = {[COLOR=Purple]'ETX'[/COLOR]};
            [COLOR=Blue]break[/COLOR]
        [COLOR=Blue]end[/COLOR]
    [COLOR=Blue]end[/COLOR]
    [COLOR=Blue]if [/COLOR]isempty(YEncry{i})
        YEncry(i) = cellstr(strcat(num2str(Y{i}),[COLOR=Purple]'!'[/COLOR])); [COLOR=Green]% no adjacent number has been found in the table, i.e. A[/COLOR]
    [COLOR=Blue]end
end[/COLOR]
disp([COLOR=Purple]'input vector ='[/COLOR]); Y
disp([COLOR=Purple]'output vector ='[/COLOR]); YEncry
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم
بجد انا مش عارف كيف أشكرك ربنا يجزيك الخير.

وأنا اسف اذا أكثرت من الأسئلة

1.كيف ممكن امثل كل حرف بخمس حروف بحيث يقفز بين الحرف الأول والتالي 5مرات وهكذا يعني أول حرف هو المطلوب و4 حروف الآخرى تمويه.

2. كيف جعل الناتج يظهر كانه نص YEncy=ab6!ETXdsa

3. المهم الشق الأخير من السؤال استرجاع الأرقام من خلال النص المشفر Yency بحيث يكون الناتج
4 76 354 2674

4. مالمقصود بهذه الأوامر varagin,varagout,nargin,nargout وان امكن مثال بسيط

مرة اخرى بتشكرك وربنا يزيدك علم وينفع المسلمين بعلمك.
 

الكوكب

عضو
إنضم
24 فبراير 2010
المشاركات
233
مجموع الإعجابات
3
النقاط
18
Salam, for question 4 the website www.mathworks.fr provides an explanation of the requested commands and it gives some useful exemples. I think that for varargin (variable arguments input) / varargout(variable arguments output) list the variables used in the input /output of the used function where nargin/nargout give their numbers.
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
مشكور أخي الكريم

لكن انا اهتمامي بشكل أكبر في الثلاث أسئلة السابقة

بارك الله فيك
 

ahmedmecha

عضو جديد
إنضم
20 أكتوبر 2006
المشاركات
365
مجموع الإعجابات
9
النقاط
0
كيف ممكن امثل كل حرف بخمس حروف بحيث يقفز بين الحرف الأول والتالي 5مرات وهكذا يعني أول حرف هو المطلوب و4 حروف الآخرى تمويه.
كود:
[COLOR=Green]% take each number in a series five times[/COLOR]
n = 1;
[COLOR=Blue]for [/COLOR]i =1:num [COLOR=Green]% num is some number[/COLOR]
    [COLOR=Blue]for [/COLOR]j = 1:5
        Temp(n) = i
         n = n+1
    [COLOR=Blue]end[/COLOR]
[COLOR=Blue]end[/COLOR]
-----------------------------------------------------------------------------
كيف جعل الناتج يظهر كانه نص YEncy=ab6!ETXdsa
كود:
t = [COLOR=Purple]''[/COLOR]; [COLOR=Green]% contains the char of YEncry[/COLOR]
[COLOR=Blue]for [/COLOR]i = 1:length(YEncry)
     buffer = YEncry{i}; 
     [COLOR=Blue]for [/COLOR]j = 1:length(buffer)
          t = strcat(t,buffer(j));
     [COLOR=Blue]end[/COLOR]
[COLOR=Blue]end[/COLOR]
t(strcmp([COLOR=Purple]''[/COLOR],t)) = []; [COLOR=Green]% delete any empty elements[/COLOR]
-----------------------------------------------------------------------------
مالمقصود بهذه الأوامر varagin,varagout,nargin,nargout وان امكن مثال بسيط
كود:
[COLOR=Green]
% varargin  : variable length input argument, i.e. the function accepts variable number of inputs
% varargout: variable length output argument, i.e. the function gives variable number of outputs
% nargin     : number of input arguments
% nargout   : number of output arguments[/COLOR]

[COLOR=Green]% main program %[/COLOR]
l = 4; [COLOR=Green]% length[/COLOR]
w = 2; [COLOR=Green]% width[/COLOR]
h = 3; [COLOR=Green]% hight[/COLOR]

disp([COLOR=Purple]'length'[/COLOR])
[length] = geoCalc (l)

disp([COLOR=Purple]'length & area'[/COLOR])
[length, area] = geoCalc(l,w)

disp([COLOR=Purple]'length & area & volume'[/COLOR])
[length, area, volume] = geoCalc(l,w,h)

[COLOR=Green]% function should be written in a separated m-file[/COLOR]
[COLOR=Blue]function [/COLOR][varargout] = geoCalc(varargin)
[COLOR=Green]% geoCalc: function calculates the length, area, volume of a line, rectangle, box depending on the
% number of the input parameters as following:
% if no. of inputs = 1 ==> calculate length ==> no. of outputs = 1
% if no. of inputs = 2 ==> calculate length+area ==> on. of outputs = 2
% if no. of inputs = 3 ==> calculate length+area+volume ==> no. of outputs = 3
[/COLOR] 
[COLOR=Blue]if [/COLOR]nargin ==1
  varargout = varargin;
[COLOR=Blue]elseif [/COLOR]nargin == 2
  varargout{1} = varargin{1};
  varargout{2} = varargin{1}*varargin{2};
[COLOR=Blue]elseif [/COLOR]nargin == 3
  varargout{1} = varargin{1};
  varargout{2} = varargin{1}*varargin{2};
  varargout{3} = varargin{1}*varargin{2}*varargin{3};
[COLOR=Blue]end[/COLOR]
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم ورحمة الله
بارك الله فيك يأخي وجعله في ميزان حسناتك

الجزء رقم 3 كيفية استعادة الأرقام من الرسالة
يعني من en_msg نحصل على ال Y

هناك بعض العلامات يمكن الاستفادة منها أثناء استرجاع الأرقام مثل
ETX يعني @ تفصل بين الارقام
وأيضا الرقم المتبوع ب ! يعني الرقم
أما بقية الحروف يمكن الحصول عليها من الجدول الخاص مع مراعاة ال Space لها رقم
أنا حاولت ولكن لم أوفق أتمنى ان أجد الجواب لديك
الملف مرفق
وشكر جزيلاَ

 

المرفقات

  • dell.rar
    565 بايت · المشاهدات: 5

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليكم
أتمنى من الأخ ahmedmecha الجواب على السؤال لإكمال حل السؤال الذي طرح بملف الورد

ولكم جزيل الشكر
 

ahmedmecha

عضو جديد
إنضم
20 أكتوبر 2006
المشاركات
365
مجموع الإعجابات
9
النقاط
0
وعليكم السلام,

آسف بصراحة ليس لدي وقت فعلاً .. أتمنى أن يكون الكود أدناه يفي بالغرض
كود:
[COLOR=Green]% i/p text YEncry = ('abETXcdETXefgaETXac6!')
% o/p vector YDecry = [23 45 7892 246]
% warning: bugs might occur when the input text contains letters similar
% to the for-loops variables, i.e. ii, jj and zz.

% author:                    ahmedmecha
% MATLAB version:  R2009b
% last review:             3. March 2011[/COLOR]

clear [COLOR=Purple]all[/COLOR]
clc
YEncry = ([COLOR=Purple]'abETXcdETXefgaETXac6!'[/COLOR]); 
A = {[COLOR=Purple]'a' 'b' 'c' 'd' 'e' 'f' 'g'[/COLOR]; 2 3 4 5 7 8 9}; [COLOR=Green]% encryption table[/COLOR]
k = strfind(YEncry,[COLOR=Purple]'ETX'[/COLOR]); [COLOR=Green]% k = [3 8 15][/COLOR]
idx = length(YEncry); [COLOR=Green]% idx = 21[/COLOR]
[COLOR=Blue]if [/COLOR]~isempty(k)
    Temp{1} = YEncry(1:k(1)-1);
    m = 2;
    [COLOR=Blue]while [/COLOR]m <= length(k)
        Temp{m} = YEncry(k(m-1)+3:k(m)-1); [COLOR=Green]% take the whole text until the next 'ETX'[/COLOR]
        m = m+1;
    [COLOR=Blue]end[/COLOR]
    Temp{m} = YEncry(k(m-1)+3:idx);  [COLOR=Green]% end of the text is reached[/COLOR]
[COLOR=Blue]else[/COLOR]
    Temp{1} = YEncry; [COLOR=Green]% there is no 'ETX' in the text[/COLOR]
[COLOR=Blue]end[/COLOR]
[COLOR=Green]% Temp={[/COLOR][COLOR=Green]'ab' 'cd' 'efga' 'ac6!'}[/COLOR]
Temp(strcmp([COLOR=Purple]''[/COLOR],Temp)) = []; [COLOR=Green]% delete empty elements[/COLOR]

errFlag = 1; [COLOR=Green]% set error flag to detect error might happen[/COLOR]
[COLOR=Blue]for [/COLOR]ii = 1:length(Temp)
    tx = '';
    buffer = Temp{ii};[COLOR=Green] % buffer type: char[/COLOR]
    [COLOR=Blue]for [/COLOR]jj = 1:length(buffer)
        nr = [COLOR=Purple]''[/COLOR];
        [COLOR=Blue]for [/COLOR]zz = 1: length(A(1,:))
            [COLOR=Blue]if [/COLOR]buffer(jj) == A{1,zz}
                nr = num2str(A{2,zz}); [COLOR=Green]% nr type: char[/COLOR]
                [COLOR=Blue]break[/COLOR]
            [COLOR=Blue]elseif [/COLOR]buffer(jj) == [COLOR=Purple]'!'[/COLOR] [COLOR=Green]% neglect it, there is a number before it[/COLOR]
                nr = [COLOR=Purple]''[/COLOR];
                errFlag = 0; [COLOR=Green]% reset error flag[/COLOR]
                [COLOR=Blue]break[/COLOR]
            [COLOR=Blue]elseif [/COLOR]~isempty(str2num(buffer(jj))) [COLOR=Green]% number is detected[/COLOR]
                nr = num2str(buffer(jj));
                [COLOR=Blue]break[/COLOR]
            [COLOR=Blue]end[/COLOR]
        [COLOR=Blue]end [/COLOR][COLOR=Green]% for zz[/COLOR]
    [COLOR=Blue]if [/COLOR](isempty(nr) && errFlag)
        fprintf([COLOR=Purple]'Error occurs while decryption, no adjacent number for <%s> was found in the encryption table !\n'[/COLOR],buffer(jj))
    [COLOR=Blue]end[/COLOR]
    tx = [tx,nr]; [COLOR=Green]% combine the result in one string[/COLOR]
    [COLOR=Blue]end [/COLOR][COLOR=Green]% for jj[/COLOR]
    tx(strcmp([COLOR=Purple]''[/COLOR],tx)) = []; [COLOR=Green]% delete empty elements[/COLOR]
    YDecry(ii) = str2num(tx);
[COLOR=Blue]end [/COLOR][COLOR=Green]% for ii[/COLOR]

[COLOR=Green]% display the result %[/COLOR]
fprintf([COLOR=Purple]'\ninput text = %s\n'[/COLOR],YEncry)
fprintf([COLOR=Purple]'\noutput vector = %s\n'[/COLOR],num2str(YDecry))
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
مشكور يأخي

ربنا يجزيك الخير
 

Ahmed AlSharif

عضو جديد
إنضم
14 يوليو 2007
المشاركات
94
مجموع الإعجابات
0
النقاط
0
السلام عليك ورحمة الله​

أخي الكريم ظهرت مشكلة صغيرة أثناء تطبيق الكود

أنه لوكان هنا Space عند تجميع الأحرف من Cell سيهمل ال Space وبالتالي هذا يؤدي الى اختفاء الرقم المقابل لل Space وبالتالي الناتج النهائي يكون مختلف

هذه الأرقام قبل الإسترجاع


كود:
 Columns 1 through 13
كود:
[RIGHT]   [1]    [6]    [6]    [7]    '@'    [2]    [7]    [2]    [6]    '@'    [2]    [5]    [7]
[RIGHT] Columns 14 through 26
   [4]    '@'    [2]    [4]    [3]    [2]    '@'    [1]    [6]    [6]    [7]    '@'    [2]
 Columns 27 through 32
   [8]    [2]    [1]    '@'    [5]    [0][/RIGHT]
[/RIGHT]


هذا النص فبل دمج الحروف لاحظ ال Space
كود:
[RIGHT] Columns 1 through 12
   '1!'    '$'    '$'    '%'    'ETX'    [COLOR=orange]' '[/COLOR]    '%'    [COLOR=orange]' '[/COLOR]    '$'    'ETX'   [COLOR=orange]' '[/COLOR]    '#'
 Columns 13 through 24
   '%'    '"'    'ETX'    [COLOR=orange]' '[/COLOR]    '"'    '!'    ' '    'ETX'    '1!'    '$'    '$'    '%'
 Columns 25 through 32
   'ETX'    ' '    '&'    ' '    '1!'    'ETX'    '#'    '0!'[/RIGHT]
[/RIGHT]


هذا الناتج بعد دمج الحروف قام بإزالة ال Space
كود:
1!$$%ETX%$ETX#%"ETX"!ETX1!$$%ETX&1!ETX#0!

بالتاي عن استرجاع الأرقام الأصلية الرقم المقابل لل Space سيكون محذوف​

كود:
output vector = 1667   [COLOR=orange]76[/COLOR]   [COLOR=orange]574 [/COLOR]   [COLOR=orange]4 [/COLOR]1667    81    50

هذه المشكلة ازالة ال Space عند الدمج يؤدي الى حذف الرقم المقابل له وبالتالي عملية الإسترجاع
الأرقام يكون فيها نقص الرقم المقابل لل Space .

أتمنى ان اجد الحل​

ولك جزيل الشكر أخي الكريم​

 
أعلى