سلام
من ورودی دارم که شامل عدد و برخی حروف لاتین هستش ،که به طور کلی شامل پانزده کاراکتر منحصر به فرد هستش
میخاستم بدونم برای فشرده سازی این فایل ارتمتیک بهتره یا هافمن یا الگوریتم دیگه ای؟
ممنون
سلام
من ورودی دارم که شامل عدد و برخی حروف لاتین هستش ،که به طور کلی شامل پانزده کاراکتر منحصر به فرد هستش
میخاستم بدونم برای فشرده سازی این فایل ارتمتیک بهتره یا هافمن یا الگوریتم دیگه ای؟
ممنون
سلام
شاید بهتر باشه روشهای مختلف را روی اونها اعمال کنید ببینید کدوم جواب بهتری میده
سلام
به جز ارتمتیک و هافمن الگوریتم دیگه ای هم هست یا همین دوتا رو تست کنم؟
و اینکه کدهایی که برای ارتمتیک گرفتم به دو قسمت تقسیم شده ، یکی نوشته ارتمتیک برای اینتیجر و یکی ازتمتیک برای کاراکتر، ولی ورودی من شامل هر دوی اینهاس، میخاستم بدونم یعنی این تابع روی ورودی که شامل هم کاراکتر باشه و هم عدد جواب نمیده؟
شما برای کاراکتر تست می کنید چون عدد ها هم به صورت کاراکتر ذخیره شدند
الگوریتم فشرده سازی که زیاد هست. حالا توی کاربرد شما دقیقا نمیدونم
سلام
ببینین آخه طول رشته خروجی رو بیشتر میده نسبت به طول رشته ورودی،آخه این چه جور فشرده سازی هستش
الان طول رشته ورودی بوده 22 طول رشته فشرده شده هستش 70
مشکل کجاس؟
Tag =0000000110010000011010101110111110001000001110110 011100010010010011001
Sequence =
AAABBCCCC345AA76DDA876
K>> size(tag,2)
ans =
70
K>> size(seq,2)
ans =
22
آها متوجه شدم
الان طول رشته ورودی من که22 هست، در واقع 22*8=176 بیت نیاز دارم برای ذخیره سازیش در حالی که برای رشته خروجی به 70*1=70 بیت نیاز دارم برای ذخیره سازی، یعنی 106 بیت الان کم شده. درسته؟؟
بله درسته تعداد بیتها مهمه
سلام
هافمن و ارتمتیک بخاطر داشتن حلقه for در قسمتی که میخان رشته ورودی رو رمز کنن، سرعت فوق العاده پایینی دارد وقتی رشته ورودی طولانی می باشد
در هافمن در قسمتی که میخاهد برای هرکاراکتر یک رمزینه پیدا کند سرعت بالاست، اما وقتی میخاهد به کمک رمزینه ها رشته رو فشرده کند، چون از یک حلقه for استفاده میکند تا کل رشته رو پیمایش کند و به ازای هر کاراکتر کد آن رابزارد سرعت خیلی پایین می اید برای حل این مشکل من حلقه for رو برداشتم و به جای آن از دستور خود متلب استفاده کردم:
encseq = strrep(encseq,huf(i).sym,huf(i).code);
این کار سرعت رو فوق العاده بالا برد که طوری که رو رشته های با طول زیاد سریع جواب میگیرم
اما مشکل من در ارتمتیک کدینگ هستش که سرعت اون هم برای رشته های طولانی(که ورودی های من اغلب با ظول بیش از 800000 کاراکتر هستن) بسیار بسیار کند میباشد. میخاستم ببینم میشه تغییری در کدش داد(مثل اون کاری که من در هافمن کردم یا چیزی شبیه به این) که سرعت ارتمتیک بالا برود برای رشته های طولانی
این هم کد ارتمتیک:
http://freesourcecode.net/matlabproj...b#.VX6gRFK0TDd
سلام
ببینید اگه سرعت مد نظر شماست پیشنهاد می کنم به طرف ++c برید
مثلا در فایل arithintcod.m در اونجا که حلقه هست
while scale>0
tag=strcat(tag,sc);
scale=scale-1;
end
می شه از strrep استفاده کرد
یا شیاد بهتر باشه به جای dec2bin و bin2dec که انجام شده کلا روی اعداد از عملگر ها بیتی استفاده بشه که نیاز داره تغییرات زیادی اعمال بشه ولی اینکه بهبود قابل توجه هست یا نه معلوم نیست
سلام
نه با سی نمیشه، چون کار من تو متلبه، و یک قسمت کوچیکش از ارتمتیک استفاده میشه و نمیتونم کل کدمو ببرم تو سی
این قسمت
while scale>0
tag=strcat(tag,sc);
scale=scale-1;
end
که داره رشته tag رو ایجاد میکنه و میچسبونه به هم و دستور strrep که برای پیدا کرد یک زیررشته در یک زیررشته دیگه و جایگزینی با یک مقدار هستش، چجوری اینو جایگزینو strcat کنم؟؟
اون خط آخر "ا شیاد بهتر باشه به جای dec2bin و bin2dec که انجام شده کلا روی اعداد از عملگر ها بیتی استفاده بشه که نیاز داره تغییرات زیادی اعمال بشه ولی اینکه بهبود قابل توجه هست یا نه معلوم نیست" رو هم متوجه منظورتون نشدم؟
سلام
نه با سی نمیشه، چون کار من تو متلبه، و یک قسمت کوچیکش از ارتمتیک استفاده میشه و نمیتونم کل کدمو ببرم تو سی
این قسمت
while scale>0
tag=strcat(tag,sc);
scale=scale-1;
end
که داره رشته tag رو ایجاد میکنه و میچسبونه به هم و دستور strrep که برای پیدا کرد یک زیررشته در یک زیررشته دیگه و جایگزینی با یک مقدار هستش، چجوری اینو جایگزینو strcat کنم؟؟
اون خط آخر "ا شیاد بهتر باشه به جای dec2bin و bin2dec که انجام شده کلا روی اعداد از عملگر ها بیتی استفاده بشه که نیاز داره تغییرات زیادی اعمال بشه ولی اینکه بهبود قابل توجه هست یا نه معلوم نیست" رو هم متوجه منظورتون نشدم؟
شما می تونید در فایل arithintcod.m به جای تکه کد زیر که در دو نقطه این فایل استفاده شده
while scale>0
tag=strcat(tag,sc);
scale=scale-1;
end
کد زیر را قرار بدید
tag = strcat(tag, repmat(sc,1, scale));
scale = 0;
در فایل arithintdecod.m هم به جای
while(s>=CC(k))
k=k+1;
end
کد زیر را بذارید
k = find( s < CC, 1);
همچنین در هر دو فایل ذکر شده این کد وجود داره
CC(1)=0;
for i=1:length(cnt)
CC(i+1)=CC(i)+cnt(i);
end
totcount=CC(i+1);
که می شه به جای اون کد زیر را گذاشت
CC =[0 cumsum(cnt)];
totcount=CC(end);
در مورد عملگر ها بیتی مثل bitand , bishift و غیره اگه بخواهید استفاده کنید فکر کنم فایده ای نداره و سرعت را پایین میاره
در کل تقریبا بیش از این قابل بهینه سازی نیست
آخرین ویرایش به وسیله rahnema1 : جمعه 29 خرداد 1394 در 13:01 عصر دلیل: اصلاح اشتباه
ممنون
ببینین توی اون کد یک arithint داریم و یک arithscale فرق این دو چیه؟
ورودی من تشکلی شده از کاراکتر حروف لاتین و اعداد، مثلن:
ASDSDA23AS3
برای فشرده سازی این از کدوم یکی باید استفاده کنم؟
یک چیز دیگه، من تغییراتی که شما گفتینو اعمال کردم اما ارور داد و اجرا نشد
??? Error using ==> strrep
Not enough input arguments.
Error in ==> arithintcod at 49
tag = strcat(tag, strrep(sc, scale));
Error in ==> arithint at 9
btag=arithintcod(alpha,cnt,seq);
در مورد ارور، با عرض معذرت من اشتباه نوشته بودم که اینجوری اصلاح کنید
tag = strcat(tag, repmat(sc,1, scale));
سلام
کدهافمن توسعه یافته، در اين روش به جاي آنكه به ازاي هر سمبول يك كلمه رمز استفاده شود براي تركيبي از سمبول ها معادل دودويي در نظر گرفته مي شود.
کدهافمن توسعه یافته رو برای متلب، کسی داره؟؟